【數據結構】雙向鏈表的創建和讀取


  雙向鏈表是為了滿足更加方便的查找前驅,而付出空間的代價的一個數據結構。雙向鏈表的節點定義如下:

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; 

全部代碼如下:

View Code
 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 }

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM