数据结构复习1.2——双向链表的插入与删除
插入元素
删除元素
代码:和单链表差不多,不会就画一画,就写出来了
//双向链表的插入与删除 #include#include typedef struct node{ int data; struct node *prior; struct node *next; }Lnode,*linklist; //双向链表初始化,定义一个linklist(Lnode*)型函数,由其带回头指针地址 linklist InitList() { Lnode *L; L=(Lnode*)malloc(sizeof(Lnode)); if(L==NULL) { printf("申请空间失败n"); exit(0); } L->next ==NULL; L->prior==NULL; return L; } //尾插法创建双向链表 void CreatList(linklist L) { Lnode *s,*r=L; int i,n,num; printf("请输入元素个数n:"); scanf("%d",&n); for(i=0;i data =num; s->prior=r;//与单链表相比就多了这一句 r->next=s; r=s; } r->next=NULL; } //判断链表长度,与单链表相同 int LongthList(linklist L) { int i=0; Lnode *p; p=L->next;//带头结点的单链表,头结点按第0个节点算 while(p!=NULL) { p=p->next; i++; } return i; } //在链表的第i个位置之后插入元素x linklist Insert(linklist &L,int i,int x) { int j; Lnode *s,*p=L; if(i<0||i>LongthList(L)) { printf("插入位置错误n"); return 0; } s=(Lnode*)malloc(sizeof(Lnode)); s->data=x; for(j=0;jnext; } //在i前插入 //在i之后 p->next->prior = s; s->next = p->next; p->next = s; s->prior = p; } //删除第i个节点,并释放 int DeleteLnode(linklist L,int i,int &x) { Lnode *p=L; int j=0; if(i<0||i>LongthList(L)) { printf("删除位置错误n"); return 0; } //找到p,即要删除的元素 while(p&&jnext; j++; } x=p->data;//如果不加取地址符,直接free p->prior->next=p->next; p->next->prior=p->prior; free(p); } //遍历链表,与遍历单链表相同 void PrintList(linklist L) { Lnode *p; p=L->next; while(p!=NULL) { printf("%dn",p->data); p=p->next; } } int main() { linklist S;int l,x; S=InitList(); CreatList(S); l=LongthList(S); printf("链表长为%dn",l); PrintList(S); Insert(S,2,4); printf("插入新元素之后,遍历n"); PrintList(S); DeleteLnode(S,3,x); printf("%d已经删除n",x); printf("删除元素之后,遍历n"); PrintList(S); }
运行结果



