首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

双向链表的创建和读取

双向链表的创建和读取

双向链表是为了满足更加方便的查找前驱,而付出空间的代价的一个数据结构。双向链表的节点定义如下:1 typedef struct node2 {3     int x;4     struct node *prior,*next;5 }DLNode;
双向链表的空间结构如下图所示:

双向链表的创建如下:
[url=][/url]
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 }[url=][/url]

上面绿颜色的字需要注意;
读取双向链表的代码如下:
[url=][/url]
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 }[url=][/url]

注意:①:由于头节点的值为空,所以p = p->next; ②:循环的条件发生了变化,因为这是一个循环链表,链表的尾部指向头部,所以条件是p!=l;
全部代码如下:
[url=][/url]
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 }
继承事业,薪火相传
返回列表