双向链表(双向带头循环)的增删查改的实现(简单易懂)

一:双向链表的概念

每个节点除开存有数据,还有一个指针指向前一个节点,一个指针指向后一个节点,尾节点和哨兵位互相指向,从而形成一个循环。

二:双向链表的实现
第一点:
本文采用三个文件进行实现
1:List.h(对实现函数以及节点的声明)
2:List.c(增删查改的函数的实现)
3:text.c(对程序的使用检测) 

第二点:

本文需要用到的参数和变量

1:plist:实参,头指针
2:phead:形参,头指针

第三点:

所有的函数实现内部第一步永远考虑是否需要对接收到的结构体指针进行断言,这样会更严谨!

1:参数为phead的,一定需要断言,因为不管该链表是否存在节点,都不会为空,因为最少也存在哨兵位的节点。

2:在删除的时候,我们还需要另外assert(phead->next != phead),避免出现只有哨兵位的情况,这样的话,不存在节点让我们去删除。

三:函数的实现讲解

前提:节点的声明

解释:

1:data用来保存节点的值,next用来指向下一个节点,prev用来指向上一个节点。

2:将类型进行一个typedef,方便之后的类型改变带来的修改,只需要修改int即可。

3:将结构体重命名为LTNode,方便之后使用。

第一个函数:创建新节点函数

解释:

1:参数为一个值,将会赋给创建的新节点的data。然后将创建的节点的next置空(会方便后续的操作)。

2:初始化(malloc)顺序表的空间为一个节点的大小,malloc函数的返回值为void*,所以需要强转为LTNode* 的类型,然后该空间才能给新节点使用。

3:malloc开辟失败的检测,以及exit(-1)代表即刻退出。

第二个函数:初始化链表

解释:

初始化一般只会使用一次,用于哨兵位的创建。 

第三个函数:打印链表

解释:

1:断言phead,链表不可能为空,最少都存在哨兵位。

2:打印不需要打印哨兵位,哨兵位本身的data没有意义,所以我们从head(哨兵位的下一个)开始遍历打印。

3:<=>符号是为了更加形象的展示循环,以及phead,是打印出来形象表示哨兵位的。

第四个函数:尾插

解释:

1: 断言phead

2:通过哨兵位的prev找到尾节点,并且放在tail里面,这样方便之后的指针指向的更改。

3:尾插一个节点进来,不但要进行尾节点和尾插节点的循环,还要进行尾插节点和哨兵位的循环。

4:当只有哨兵位的时候,tail也就是哨兵位,以上的步骤依旧可以正常的尾插,所以不需要额外增加情况的判断。

第五个函数:尾删

解释:

1:断言 phead->next是因为避免出现只有哨兵位的情况,这样的话,不存在节点让我们去删除。

2:tail和tailprev节点的创建,方便我们后面进行更改指针的指向。

3:记得释放掉tail。

第六个函数:头插

 解释:

1:断言 

2:头插不仅要进行首节点和头插节点的循环,还要记得进行头插节点和哨兵的循环

3:当只有哨兵位的时候,first也就是哨兵位,以上的步骤依旧可以正常的头插,所以不需要额外增加情况的判断。

第七个函数: 头删

解释:

1: 断言 phead->next是因为避免出现只有哨兵位的情况,这样的话,不存在节点让我们去删除。

2:头删要进行第二个节点和哨兵位循环。

3:释放掉头结点

第八个函数:查找值为x的节点

解释:

1:断言。

2:应该从哨兵的下一个节点开始遍历查找。 

第九个函数:在pos节点前插入一个值为x的节点

解释:

1:断言

2:不仅要进行新节点和pos节点的循环,还要进行新节点和pos前一个节点的循环 

第十个函数:删除pos节点

解释:

1:将pos的前后节点进行循环连接,再释放pos即可 

第十一个函数:计算节点个数

解释:

1:从哨兵位的下一个开始计数才是正确的 

最后是text.c函数进行一系列测试的运行结果:

头文件的展示:

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大模型都在用的GQA是什么

论文&#xff1a;Training Generalized Multi-Query Transformer Models from Multi-Head Checkpoints 更详细内容直接看原文&#xff01;&#xff01;&#xff01; 摘要 Multi-query attention&#xff08;MQA&#xff09;只使用一个键值头&#xff0c;大大加快了解码器推理…

KAN网络

目录 背景知识 什么是神经网络&#xff1f; 神经网络发展史 MP神经元模型 感知机模型 KAN 引言 MLP架构vsKAN架构 从数学定理方面来看&#xff1a; 从算法层面上看&#xff1a; 从实际应用过程看&#xff1a; KAN的架构细节 KAN的准确性 KAN的可解释性 监督学习…

构建NFS远程共享存储

nfs-server:10.1.59.237 nfs-web:10..159.218 centos7,服务端和客户端都关闭防火墙和selinux内核防火墙&#xff0c;如果公司要求开启防火墙&#xff0c;那需要放行几个端口 firewall-cmd --add-port2049/tcp --permanent firewall-cmd --add-port111/tcp --permanent firew…

基于 Satchmo 实现自定义捐款模块

1、问题背景 我在 Satchmo 中构建捐款模块时遇到了一些困难。我可以自定义 Satchmo 的产品模型&#xff0c;但无法找到任何与捐赠相关的内容。 我知道可以创建一个捐赠虚拟产品&#xff0c;但据我所知&#xff0c;这仍然需要预先设定金额&#xff08;例如 5 美元、10 美元等&…

强化学习在一致性模型中的应用与实验验证

在人工智能领域&#xff0c;文本到图像的生成任务一直是研究的热点。近年来&#xff0c;扩散模型和一致性模型因其在图像生成中的卓越性能而受到广泛关注。然而&#xff0c;这些模型在生成速度和微调灵活性上存在局限。为了解决这些问题&#xff0c;康奈尔大学的研究团队提出了…

综合性练习(验证码案例)

目录 一、需求 二、准备工作 三、约定前后端交互接口 1、需求分析 2、接口定义 四、Hutool工具介绍 1、引入依赖 2、测试使用Hutool生成验证码 五、实现服务器端代码 代码解读&#xff1a; 六、调整前端页面代码 七、运行测试 随着安全性的要求越来越高&#xff0c…

Python网络爬虫原理及实践(2)

2.4.1.2. HTML源码分析 Web端站点和M端站点返回结果都是HTML格式&#xff0c;部分站点为了提升页面渲染速度&#xff0c;或者为了增加代码分析难度&#xff0c;通过动态JavaScrip执行等方式&#xff0c;动态生成HTML页面&#xff0c;网络爬虫缺少JS执行和渲染过程&#xff0c;…

人工智能能否解决科学问题:Wolfram的视角

引言 在当今AI技术飞速发展的背景下&#xff0c;它在科学研究领域的应用正逐渐深入。从AlphaFold 3的推出到日益复杂的计算模型&#xff0c;AI似乎在向科学家的角色靠拢。然而&#xff0c;美国计算机科学家Stephen Wolfram在一系列讲座和文章中提出了反思&#xff1a;AI真的能…

Crossplane 实战:构建统一的云原生控制平面

1 什么是 Crossplane Crossplane 是一个开源的 Kubernetes 扩展&#xff0c;其核心目标是将 Kubernetes 转化为一个通用的控制平面&#xff0c;使其能够管理和编排分布于 Kubernetes 集群内外的各种资源。通过扩展 Kubernetes 的功能&#xff0c;Crossplane 对 Kubernetes 集群…

可观测性监控

1 目的 常见的监控&#xff0c;主要是以收集数据以识别异常系统效应为主&#xff0c;多是单个服务&#xff0c;相互独立的状态。 可观测性&#xff0c;希望调查异常系统效应的根本原因&#xff0c;能够把多个服务、中间件、容器等串联起来&#xff0c;同时柔和metrics、log、…

WEB后端复习——javabean与会话cookie、session

JavaBean 是一种符合特定命名约定的 Java 类&#xff0c;它通常用于封装数据。 JavaBean 的主要特点是&#xff1a; 1. 无参构造器&#xff1a;JavaBean 必须有一个公共的&#xff08;public&#xff09;无参构造方法&#xff0c;以便于反射时能够创建对象实例。 2. 属性&…

【数据结构】心里有 “B树“ 么?

序言 在学习数据库之前&#xff0c;博主觉得有必要学习B树系列&#xff0c;以便之后更好地了解其原理&#xff0c;既然说到这里了&#xff0c;那就再说几句&#xff0c;数据库是帮助我们管理存在硬件当中的数据&#xff0c;如果要从中读取数据&#xff0c;就要考虑到硬件的读取…

fastjson2使用

说明&#xff1a;fastjson2是一个性能极致并且简单易用的Java JSON库&#xff08;官方语&#xff09;&#xff0c;本文介绍在Spring Boot项目中如何使用fastjson2。 创建项目 首先&#xff0c;创建一个Maven项目&#xff0c;引入fastjson2依赖&#xff0c;如下&#xff1a; …

MIPI DPHY HS传输模式SoT和EoT的传输值

目录 1. 高速传输模式的传输序列 2. SoT传输序列 3. EoT传输序列 1. 高速传输模式的传输序列 Mipi DPHY的高速数据传输&#xff08;HST&#xff1a;High Speed Transmission&#xff09;以突发&#xff08;Burst&#xff09;方式发生。 为了帮助接收机同步&#xff1a; (1) …

3D分子生成的定制扩散框架 MolDiff - 评测

MolDiff模型是一种考虑分子键生成的3D分子生成的新模型。MolDiff是清华大学智能产业研究院马剑竹课题组发表在PMLR 2023的工作&#xff0c;第一作者是Xingang Peng&#xff0c;文章题目为&#xff1a;《 Addressing the Atom-Bond Inconsistency Problem in 3D Molecule Genera…

【一刷《剑指Offer》】面试题 18:树的子结构

力扣对应题目链接&#xff1a;LCR 143. 子结构判断 - 力扣&#xff08;LeetCode&#xff09; 牛客对应题目链接&#xff1a;树的子结构_牛客题霸_牛客网 (nowcoder.com) 核心考点&#xff1a;二叉树理解&#xff0c;二叉树遍历。 一、《剑指Offer》对应内容 二、分析问题 二叉…

03继承与多态续

1、虚基类与虚继承 class A { public:virtual void func(){cout << "call A ::func()" << endl;}void operator delete(void* ptr){cout << "operator delete ptr " << ptr << endl;free(ptr);} private:int ma;};class B :…

[C++初阶]string的几道oj题

1.LCR 192. 把字符串转换成整数 (atoi) 这题难度不大,我这里采取遍历跳过空格的方式&#xff0c;我先展示出我的代码,然后慢慢讲解: class Solution { public:int myAtoi(string str) {if (str.empty()) return 0;int lengthstr.size();int i0;int symbol1;int sum0;while(i&l…

如何快速优雅的免费申请和搭建属于自己的服务器

今天来讲一下如何快速优雅的搭建属于自己的服务器&#xff0c;我们以阿里云的云服务器为例&#xff0c;新用户一般是有三个月使用期限。 首先我们进入官网&#xff0c;选择云服务器ecs 链接直达&#xff1a;https://cn.aliyun.com 打开网页后&#xff0c;往下滑&#xff0c;然…

【FFmpeg】Filter 过滤器 ② ( 裁剪过滤器 Crop Filter | 裁剪过滤器语法 | 裁剪过滤器内置变量 | 裁剪过滤器常用用法 )

文章目录 一、裁剪过滤器1、裁剪过滤器简介2、裁剪过滤器语法3、裁剪过滤器内置变量4、裁剪过滤器示例5、裁剪过滤器应用6、裁剪过滤器图示 二、裁剪过滤器常用用法1、裁剪指定像素的视频区域2、裁剪视频区域中心正方形 - 默认裁剪3、裁剪视频区域中心正方形 - 手动计算4、裁剪…