雙向鏈表是為了滿足更加方便的查找前驅,而付出空間的代價的一個數據結構。雙向鏈表的節點定義如下:
1 typedef struct node 2 { 3 int x; 4 struct node *prior,*next; 5 }DLNode;
雙向鏈表的空間結構如下圖所示:
雙向鏈表的創建如下:
1 //創建雙向鏈表 2 DLNode *create_DList() 3 { 4 DLNode *p,*h,*l; 5 int n,i,x; 6 h = (DLNode *)malloc(sizeof(DLNode)); 7 h->prior = h; //當空的雙向鏈表就像上圖那樣前驅和后驅都會指向自己; 8 h->next = h; 9 p = h; 10 printf("請輸入需要創建雙向鏈表的長度:"); 11 scanf("%d",&n); 12 for(i = 0; i < n; i++) 13 { 14 printf("請輸入第%d個數",i+1); 15 scanf("%d",&x); 16 l = (DLNode *)malloc(sizeof(DLNode)); 17 l->x = x; 18 p->next = l; 19 l->prior = p; 20 l->next = h; //注意,l->next鏈接的是頭節點, 21 h->prior = l; //而頭結點的前驅是l。 這樣便構成了一個循環的雙向鏈表 22 p = l; 23 } 24 return(h); //不要忘記返回鏈表 25 }
上面綠顏色的字需要注意;
讀取雙向鏈表的代碼如下:
1 void out_DList(DLNode *l) 2 { 3 DLNode *p; 4 int i; 5 p = l; 6 p = p->next; 7 while(p!=l) //注意條件發生了變化 8 { 9 printf("%5d",p->x); 10 p = p->next; //不要忘記讓p指向下一個節點; 11 } 12 }
注意:①:由於頭節點的值為空,所以p = p->next; ②:循環的條件發生了變化,因為這是一個循環鏈表,鏈表的尾部指向頭部,所以條件是p!=l;
全部代碼如下:

1 #include<stdio.h> 2 #include <stdlib.h> 3 4 typedef struct node 5 { 6 int x; 7 struct node *prior,*next; 8 }DLNode; 9 10 //函數聲明 11 DLNode *create_DList(); 12 void out_DList(DLNode *l); 13 14 main() 15 { 16 DLNode *l; 17 l = create_DList(); 18 printf("創建成功!"); 19 out_DList(l); 20 } 21 22 //讀取雙向鏈表 23 void out_DList(DLNode *l) 24 { 25 DLNode *p; 26 int i; 27 p = l; 28 p = p->next; 29 while(p!=l) 30 { 31 printf("%5d",p->x); 32 p = p->next; 33 } 34 } 35 36 37 //創建雙向鏈表 38 DLNode *create_DList() 39 { 40 DLNode *p,*h,*l; 41 int n,i,x; 42 h = (DLNode *)malloc(sizeof(DLNode)); 43 h->prior = h; 44 h->next = h; 45 p = h; 46 printf("請輸入需要創建雙向鏈表的長度:"); 47 scanf("%d",&n); 48 for(i = 0; i < n; i++) 49 { 50 printf("請輸入第%d個數",i+1); 51 scanf("%d",&x); 52 l = (DLNode *)malloc(sizeof(DLNode)); 53 l->x = x; 54 p->next = l; 55 l->prior = p; 56 l->next = h; 57 h->prior = l; 58 p = l; 59 } 60 return(h); 61 }