【数据结构】双向链表的创建和读取

  双向链表是为了满足更加方便的查找前驱,而付出空间的代价的一个数据结构。双向链表的节点定义如下:

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 }

 

 

posted @ 2012-09-25 16:40  net小伙  阅读(18192)  评论(1编辑  收藏  举报