雙鏈表是基於單鏈表的基礎上加了一個前結點的前驅指針,使得鏈表的向前遍歷功能實現,同時,也大大的解決了單鏈表的不少不足的地方。詳情請看詳細的代碼: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; }