双链表是基于单链表的基础上加了一个前结点的前驱指针,使得链表的向前遍历功能实现,同时,也大大的解决了单链表的不少不足的地方。详情请看详细的代码:ios
#include <iostream> #include <stdio.h> #include <stdlib.h> /* run this program using the console pauser or add your own getch, system("pause") or input loop */ typedef struct DNode{ int data;//数据域 struct DNode *prior,*next;//指针域(前指针和后指针) }DNode,*DLinkList; //初始化双链表 bool InitDLinkList(DLinkList &L){ L = (DNode*)malloc(sizeof(DNode));//建立头结点 if(L==NULL){//内存不足分配失败 return false; } L->prior = NULL;//头结点前驱指针永远指向NULL L->next = NULL;//头结点后面暂时没有其它结点 return true; } //建立双链表 /* DLinkList InsertDNode(DLinkList &L){ DNode *p; int x; p = L; scanf("%d",&x); while(x!=9999){ DNode *s = (DNode*)malloc(sizeof(DNode)); s->prior = NULL; s->next = NULL; s->data = x; p->next = s; s->prior = p; p = p->next; scanf("%d",&x); } p->next = NULL; return L; } */ //建立双链表 DLinkList InsertDNode(DLinkList &L){ DNode *p; int x; p = L; scanf("%d",&x); while(x!=9999){ DNode *s = (DNode*)malloc(sizeof(DNode)); s->prior = NULL; s->next = NULL; s->data = x; p->next = s; s->prior = p; p = p->next; scanf("%d",&x); } p->next = NULL; return p; } //在p结点以后插入s结点 bool InsertNextDNode(DNode *p,DNode *s){ if(p==NULL||s==NULL){ return false; } s->next = p->next; if(p->next!=NULL){ p->next->prior = s; } s->prior = p; p->next = s; return true; } //删除p结点后的后继结点 bool DeleteNextDNode(DNode *p){ if(p==NULL){ return false; } DNode *q = p->next;//q指针指向目标结点 if(q==NULL){ return false; } p->next = q->next; if(q->next!=NULL){//判断目标结点后继结点是否是NULL q->next->prior = p; } free(q);//释放目标结点 return true; } //销毁双链表 void DestoryList(DLinkList &L){ while(L->next!=NULL){//循环删除结点 DeleteNextDNode(L); } free(L);//释放头结点 L = NULL;//头指针指向NULL } //遍历双链表(前向遍历) void p(DLinkList L,DNode *p){ // DNode *p; /* p = L->next;//向前遍历前两个结点 */ while(p->prior!=NULL){ printf("%d\t",p->data); p = p->prior; } } //遍历双链表(先后向遍历) void p2(DLinkList L){ DNode *p; p = L->next;//向前遍历前两个结点 /* while(p!=NULL){ printf("%d\t",p->data); p = p->next; } */ while(p->next!=NULL){ printf("%d\t",p->data); p = p->next; } if(p!=NULL){ printf("%d\t",p->data); } while(p->prior!=NULL){ printf("%d\t",p->data); p = p->prior; } } //遍历双链表(后向遍历) void p1(DLinkList L){ DNode *p; p = L->next;//向后遍历 while(p!=NULL){ printf("%d\t",p->data); p = p->next; } } //按位序查找 DNode *getElem(DLinkList L,int i){ DNode *q; q = L->next; int j = 1; if(i<1){ return NULL; } while(q!=NULL&&j<i){ q = q->next; j++; } if(q==NULL){ return NULL; } return q; } int main(int argc, char** argv) { DLinkList L; InitDLinkList(L);//初始化双链表 DNode *p1 = InsertDNode(L);//建立双链表,并返回当前变量p指针指向的表尾元素 p(L,p1);//反向输出双链表 printf("\n"); p2(L);//正反输出双链表 printf("\n"); DNode *q = getElem(L,3); // printf("q=%d\n",q->data); DeleteNextDNode(q);//删除双链表最后一位元素 p2(L); // DestoryList(L); // p2(L); return 0; }