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

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

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 }

 

 

你可能感兴趣的:(数据结构)