双向链表的基本操作(增删改查)

#include<stdio.h>
#include<malloc.h>
#define ElemType int
typedef struct DulLNode{
 ElemType data;
 struct DulLNode *lLink,*rLink;
 //定义双指针,
 //lLink头指针,rLink尾指针
}DulLNode;  


DulLNode *create_DulLNode(DulLNode *first){//双向循环链表
 DulLNode *newp;
 int a;
 DulLNode *tail;
 first=tail=(DulLNode *)malloc(sizeof(DulLNode));
 first->rLink=first;//创建带头节点的循环双向链表
 first->lLink=first->rLink;
 printf("请输入节点a:\n");
 scanf("%d",&a);
 while(a!=-1){
  newp=(DulLNode *)malloc(sizeof(DulLNode));
  newp->data=a;
  //尾插创建链表
  newp->rLink=first; 
  newp->lLink=tail->rLink;
  tail->rLink=newp;
  first->lLink=newp->rLink;
  tail=newp;
  scanf("%d",&a);
 }
 return first;
}


DulLNode *Insert_DulLNode(DulLNode *first){//在节点p后插入新节点
 DulLNode *newp,*p;
 int a,b;
 newp=(DulLNode *)malloc(sizeof(DulLNode));
 p=first->rLink;
 printf("请输入插入的节点及谁的后面\n");
 scanf("%d %d",&a,&b);
 for(p=first->rLink;p!=first;p=p->rLink){
  if(p->data==b){
   newp->data=a;
   newp->rLink=p->rLink;
   newp->lLink=p;
   p->rLink=newp;
   p->rLink->lLink=newp;
   break;
  } 
 }
 return first; 
}


DulLNode *Delete_ByValue(DulLNode *first){
 //根据值删除节点
 DulLNode *q,*p;
 int a;
 printf("输入你要删除的节点\n");
 scanf("%d",&a);
 for(p=first->rLink,q=first;p!=first;){
  if(p->data==a){
   q->rLink=p->rLink;
   (p->rLink)->lLink=q;
   free(p);
   break;
  }else{
   p=p->rLink;
   q=q->rLink;
  }
 }
 return first;
}


void print(DulLNode *first){//s输出函数
 DulLNode *p;
 for(p=first->rLink;p!=first;p=p->rLink){
  printf("%d ",p->data);
 }
 printf("\n");
}
int main(){
 DulLNode *first;
 first=create_DulLNode(first);
 print(first);
 
 first=Insert_DulLNode(first);
 print(first);
 
 first=Delete_ByValue(first);
 print(first);
 return 0;
}

猜你喜欢

转载自www.cnblogs.com/jiafeng1996/p/11286319.html