2.3线性表的链式存储和运算—单链表应用举例
例2.5 已知单链表H,写一算法将其倒置。即实现如图2.22的操作。(a)为倒置前,(b)为倒置后。
算法思路:依次取原链表中的每个结点,将其作为第一个结点插入到新链表中去,指针p用来指向当前结点,p为空时结束。
算法如下:
1 void reverse (Linklist H) 2 { 3 LNode *p; 4 p=H->next; /*p指向第一个数据结点*/ 5 H->next=NULL; /*将原链表置为空表H*/ 6 while (p) /*p结点不为空,循环*/ 7 { 8 q=p; /*用另一个结点q存储p结点的信息*/ 9 p=p->next; /*不断后移*/ 10 q->next=H->next; /*将当前结点插到头结点的后面*/ 11 H->next=q; /*将头结点与当前结点相连*/ 12 } 13 }
算法2.15
该算法只是对链表中顺序扫描一边即完成了倒置,所以时间性能为O(n)。
例2.6 已知单链表L,写一算法,删除其重复结点,即实现如图2.23的操作。(a)为删除前,(b)为删除后。
算法思路:用指针p 指向第一个数据结点,从它的后继结点开始到表的结束,找与其值相同的结点并删除之;p 指向下一个;依此类推,p 指向最后结点时算法结束。
算法如下:
1 void pur_LinkList(LinkList H) 2 { 3 LNode *p,*q,*r; 4 p=H->next; /*p指向第一个结点*/ 5 if(p==NULL) 6 return; 7 while (p->next) 8 { 9 q=p; 10 while (q->next) /* 从*p的后继开始找重复结点*/ 11 { 12 if (q->next->data==p->data) 13 { 14 r=q->next; /*找到重复结点,用r指向,删除*r */ 15 q->next=r->next; 16 free(r); 17 } 18 else 19 q=q->next; 20 } 21 p=p->next; /*p指向下一个,继续*/ 22 } 23 }
算法2.16
该算法的时间性能为O(n2)。
例2.7 设有两个单链表A、B,其中元素递增有序,编写算法将A、B归并成一个按元素值递减(允许有相同值)有序的链表C,要求用A、B中的原结点形成,不能重新申请结点。
算法思路:利用A、B两表有序的特点,依次进行比较,将当前值较小者摘下,插入到C表的头部,得到的C表则为递减有序的。
算法如下:
1 LinkList merge(LinkList A,LinkList B) 2 /*设A、B均为带头结点的单链表*/ 3 { 4 LinkList C; 5 LNode *p,*q; 6 p=A->next; /*A的第一个结点*/ 7 q=B->next; /*B的第一个结点*/ 8 C=A; /*C表的头结点*/ 9 C->next=NULL; /*C表置空*/ 10 free(B); /*释放B的头结点*/ 11 while (p&&q) /*p和q结点都存在*/ 12 { 13 if(p->data<q->data) /*从原AB表上摘下较小者*/ 14 { 15 s=p; /*临时结点s指向p*/ 16 p=p->next; 17 } 18 else 19 { 20 s=q; 21 q=q->next; 22 } 23 s->next=C->next; /*C表的第一个结点赋给结点s的后继*/ 24 C->next=s; /*将结点s赋给C表头结点的后继*/ 25 } 26 if (p==NULL) 27 p=q; 28 while (p) /* 将剩余的结点一个个摘下,插入到C表的头部*/ 29 { 30 s=p; 31 p=p->next; 32 s->next=C->next; 33 C->next=s; 34 } 35 }
算法2.17
该算法的时间性能为O(m+n)。
转载于:https://www.cnblogs.com/chunlanse2014/articles/4439661.html
2.3线性表的链式存储和运算—单链表应用举例相关推荐
- 线性表的链式存储结构以及单链表的插入和删除原理实现
线性表的链式存储结构 线性表中的每个元素最多只有一个前驱元素和一个后继元素(其逻辑结构),因此可以采用链式存储结构存储. 链表 线性表的链式存储结构称为链表.在链表中每个结点不仅包含有元素本身的信息( ...
- 2.3线性表的链式存储和运算—双向链表
以上讨论的单链表的结点中只有一个指向其后继结点的指针域next,因此若已知某结点的指针为p,其后继结点的指针则为p->next ,而找其前驱则只能从该链表的头指针开始,顺着各结点的next 域进 ...
- 数据结构开发(5):线性表的链式存储结构
0.目录 1.线性表的链式存储结构 2.单链表的具体实现 3.顺序表和单链表的对比分析 4.小结 1.线性表的链式存储结构 顺序存储结构线性表的最大问题是: 插入和删除需要移动大量的元素!如何解决? ...
- 这一篇让你弄懂线性表的链式存储结构
线性表的链式存储结构以及单链表概念 本篇内容是线性表链式存储结构的相关概念 这里有几篇线性表的干货供大家讨论学习: 这里是吐血总结的线性表顺序存储结构 这里是单链表的各种操作,超详细~ 双向链表.循环 ...
- 数据结构和算法:(3)3.2线性表的链式存储结构
线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素也就是说你这个可以放在A地点,这个可以放在E地点,A地点和E地点中间可以隔开一个C地点和D地点,这样是允许的),这组存储单元可以存在 ...
- 链表list(链式存储结构实现)_5 线性表的链式存储结构
系列文章参考资料为<大话数据结构>,源码为个人私有,未经允许不得转载 线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素,可以使连续的,也可以不连续,也就意味这些元素可以 ...
- JAVA数据结构 线性表的链式存储及其实现
2019独角兽企业重金招聘Python工程师标准>>> 2线性表的链式存储及其实现 虽然顺序表具有随机存取的特点是一种有用的存储结构但是也有缺陷: (1) 若需要给顺序表增 ...
- 从零开始学数据结构和算法(二)线性表的链式存储结构
链表 链式存储结构 定义 线性表的链式存储结构的特点是用一组任意的存储单元的存储线性表的数据元素,这组存储单元是可以连续的,也可以是不连续的. 种类 结构图 单链表 应用:MessageQueue 插 ...
- C和C++线性表的链式存储
C和C++线性表的链式存储 基本概念 链表技术领域推演 设计与实现 重要技术场景图 链表链式存储_插入 链表链式存储_删除 优点和缺点 基本概念 链式存储定义 为了表示每个数据元素与其直接后继元素之间 ...
最新文章
- java.sql.SQLException: Data truncation: Truncated incorrect DOUBLE value
- 技术/领域专家有什么要求?
- C# 多线程參数传递
- Spark Metrics配置详解
- 值得借鉴的30条好习惯
- 内网(局域网)中共享文件
- 特斯拉电动皮卡发布:马斯克称它能防弹、能上火星,结果还没扛过一钢球......
- c#+web与php,将Web服务客户端从c#转换为php
- JavaScript面向对象详解
- 拓端tecdat|R语言如何和何时使用glmnet岭回归
- 文章最重要的并不是原创,而是伪原创
- 常用元器件使用方法12:单节锂电池充电管理芯片XT2055的使用方法
- .bat批处理文件格式运行JAVA应用程序
- 论文书写之如何引用参考文献(简单明了)
- 【leetcode】771. 宝石与石头 (简单)
- antd design mobile +react 动态生成表单
- Speedoffice(word)文档如何修图
- iOS13.4.1每次越狱后要做的事
- Android音频格式转换,Android音视频系列(八):了解音频格式WAV以及与PCM的转换...
- 如何在windows电脑端添加本地环回网卡loopback网络适配器