双向链表(1)

前面说过在需要不停的找前驱时(删除要找前驱等等),其时间复杂度很大。

这个图就是双向链表,相当于2个(方向相反的)单链表合起来

所以双向链表的结构设计就是比单链表多了一个指针域,以空间换时间,减小时间复杂度

DList指向整个表,DNode指向头结点,头结点后面串起了整个表,所以虽然两个的含义不同,但在计算机里面的用法是等价的,都是代表整个表

结构设计看图;

初始化看结构内部成员有无影响

也就是

测试

头插函数(插入在头结点后面的第一个有效数据的位置上)

思路:

1.创建一个新结点,将val数值丢进去

2.将新结点连接进去。可以分开接,先接上面那条线。那就跟原来的单链表连接方式一样了

先绑后面(箭头后面),再绑前面

然后反过来接下面那条线,一共4条线,注意先后顺序

第一句话一定在最上面,剩下3句的顺序可更改

1.p的next置为500,p的NULL变为500——p->next = plist->next;

2.plist的next置为800,plist的500变为800——plist->next = p;

3.p的prio置为100,p的NULL变为100——p->prio = plist;

4.p的next的prio中的100变为800——p->next->prio = p;

可以照着单链表的头插写

malloc之后要加断言

测试

为负数,代码崩溃了

代码崩溃的主要原因之一就有——访问了空的指针,特别是在什么的什么的什么,这样的多级指针时,其中某一级指针为空时,整句代码都将崩溃。

下面排查一下头插函数中,有没有指针为空的情况

第一句:如果当p为空时,访问p的next就会崩溃。

        但在创建新结点p时,就断言了p不为空。所以p不可能为空。

(p不为空,则访问p的next或是访问p的prio都没错)

        而plist在一进入函数开始就断言了不为空

        所以第一句没错

第二句:不为空,也没错

第三句:不为空,也没错

第四句:如果当p->next为空时,访问p->next的prio就会崩溃

恰好p->next就有为空的可能情况,即在只有一个plist头结点的情况下,

此时plist->next就为空,再经过第一句

之后,此时p->next就是空

那么访问p->next的prio就会崩溃

第一句

第二句:上边的单链表已经串起来了

第三句:此时已经完成了双向链表的连接

此时就不需要绑第(4)条线了,即不执行第四句话了

所以上面的测试中,在插入第一个i(头结点后第一个i)时,程序就已经崩溃了

综上所述,问题出在我们需要判断第四句话什么时候不需要执行(在只有一个头结点plist的双向链表中进行头插),什么时候需要执行。所以我们要给它加上执行条件

测试

先写一个Show输出函数

测试

        

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/492909.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux提权—服务漏洞,以MySQL-UDF提权为例

UDF(user defined function,用户自定义函数) 利用条件: 有对MySQL数据库进行创建,插入,删除的权限 secure_file_priv为空 利用过程 secure_file_priv的值为空或者是我们恰巧需要用到的目录,如下: 提权成…

Flink代码单词统计 ---批处理

flatMap:一对多转换操作,输入句子,输出分词后的每个词groupBy:按Key分组,0代表选择第1列作为Keysum:求和,1代表按照第2列进行累加print:打印最终结果 1.WordCount代码编写 需求&am…

Docker基础(一)

文章目录 1. 基础概念2. 安装docker3. docker常用命令3.1 帮助命令3.2 镜像命令3.3 容器命令3.4 其他命令 4. 使用案例 1. 基础概念 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官…

精酿啤酒:酵母的选择与发酵时间的影响

酵母是啤酒酿造过程中不可或缺的微生物,其选择和发酵时间对啤酒的口感、品质和风格产生着重要影响。Fendi Club啤酒在酵母的选择与发酵时间的控制方面有着与众不同的技巧和经验。 首先,酵母的选择对啤酒的发酵过程和品质重要。Fendi Club啤酒选用品质、高…

kubectl 命令行管理K8S

目录 陈述式资源管理方法 1.基本信息查看 查看版本信息 查看资源对象简写 查看集群信息 配置kubectl自动补全 node节点查看日志 查看 master 节点状态 查看命名空间 查看default命名空间的所有资源 创建命名空间yy 删除命名空间yy 在命名空间kube-public 创建副本…

vue2实现无感刷新token

🎬 江城开朗的豌豆:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 📝 个人网站 :《 江城开朗的豌豆🫛 》 ⛺️ 生活的理想,就是为了理想的生活 ! 目录 📘 引言: &#x1f4…

力扣用例题:2的幂

此题的解题方法在于根据用例调整代码 bool isPowerOfTwo(int n) {if(n1){return true;}if(n<0){return false;}while(n>2){if(n%21){return false;}nn/2; }if(n1){return false;}return true;}

Kubernetes基础(二十五)-Kubernetes GC原理

1 K8s 的垃圾回收策略 当给k8s一个资源对象设置OwnerReference的时候&#xff0c;删除该资源对象的owner, 该对象也会被连带删除。这个时候用的就是k8s的垃圾回收机制。 k8s目前支持三种回收策略&#xff1a; 1&#xff09;前台级联删除&#xff08;Foreground Cascading De…

129 Linux 系统编程7 ,make 的编写和解析

前文中&#xff0c;我们有多少个.c文件&#xff0c;就需要build 出来多少个.o文件 假设我们的项目很大&#xff0c;怎么管理这些 .c文件呢&#xff1f; 这里就要学习一个make文件的编写了。 makefile 本质上是一个脚本语言 脚本语言实际上就是将一系列命令放在一起执行 mak…

Java 存图方式

一、邻接矩阵 二、邻接表 以点为基本单位,尾插。 三、链式前向星 chain forward star 模拟链表,采用 头插 方法,以边为单位,记录每一条边的目标点。 head[i]:存储以结点 i 为起点的所有边的起始位置 edge[i]:存储第 i 条边的信息 1、初始化 定义三个数组: int m…

【前端素材】推荐优质后台管理系统Skydash平台模板(附源码)

一、需求分析 后台管理系统&#xff08;或称作管理后台、管理系统、后台管理平台&#xff09;是一种专门用于管理网站、应用程序或系统后台运营的软件系统。它通常由一系列功能模块组成&#xff0c;为管理员提供了管理、监控和控制网站或应用程序的各个方面的工具和界面。以下…

web安全学习笔记【17】——信息打点(7)

信息打点-APP资产&知识产权&应用监控&静态提取&动态抓包&动态调试 #知识点&#xff1a; 1、业务资产-应用类型分类 2、Web单域名获取-接口查询 3、Web子域名获取-解析枚举 4、Web架构资产-平台指纹识别 ------------------------------------ 1、开源-CMS指…