双向链表

来源:互联网 发布:中南民族大学网络 编辑:程序博客网 时间:2024/06/16 01:29

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

1 typedef struct node2 {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 }
0 0
原创粉丝点击