博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【数据结构】双向链表的创建和读取
阅读量:7259 次
发布时间:2019-06-29

本文共 2177 字,大约阅读时间需要 7 分钟。

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

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; 

全部代码如下:

View Code
1 #include
2 #include
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 }

 

 

转载地址:http://rlodm.baihongyu.com/

你可能感兴趣的文章
高性能Mysql主从架构的复制
查看>>
微服务是传统企业电商解决方案的银弹吗?
查看>>
尝试手写一个注解框架
查看>>
MyBatis学习笔记(2)—映射关系篇
查看>>
前端每周清单第 46 期: 2017 Node.js / GraphQL / Vue.js 盘点,前端性能优化与可用性保障...
查看>>
pip离线安装和配置pypi国内加速镜像实践
查看>>
漏洞挖掘基础之格式化字符串
查看>>
[精华翻译] Rxjava 2.x : What's different in 2.0
查看>>
Android 异步任务知识梳理(3) AsyncQueryHandler 源码解析
查看>>
antd源码解读(6)- Affix
查看>>
scrollTop兼容各种浏览器
查看>>
UICollectionView(二)
查看>>
Spring Boot 中使用 LogBack 配置
查看>>
leetcode题解(链表类)
查看>>
用Elasticsearch构建电商搜索平台
查看>>
Refresh your Java skills--聊聊Java9 中模块化设计是如何实现类似IOC依赖注入效果及与其区别...
查看>>
链表实现两个多项式的加法
查看>>
Egg 实现一个 mTime 时光网
查看>>
前端中的简单编程题-数组(1)
查看>>
LeetCode之Squares of a Sorted Array(Kotlin)
查看>>