单链表详解(2)

三、函数定义

查找节点

//查找结点
SLTNode* SLTNodeFind(SLTNode* phead, SLTDataType x)
{assert(phead);SLTNode* pcur = phead;while (pcur){if (pcur->data == x){return pcur;}pcur = pcur->next;}return NULL;
}

查找节点我们是通过看数据域来查找的,查找节点函数的返回值类型是SLTNode* 因为不涉及到链表的修改,我们只需要传值;同样地,首=首先要断言看链表是否为空;为了方便遍历链表,我们定义一个节点pcur,在循环中没经历一个节点时,就拿这个节点地数据域的值和传入的数据进行比较,直到最后一个几点,如果某个节点的数据域的值和传入的值相同,就返回这个节点,若是遍历完链表还是找不到,说明这个链表没有要查找的节点,那么就返回NULL。

相关测试:

 

指定位置之前插入数据

//在指定位置之前插入数据
void SLTInsertFront(SLTNode** pphead,SLTNode* pos, SLTDataType x)
{assert(pphead && *pphead);assert(pos);if (pos == *pphead){SLTPushFront(pphead, x);}else{SLTNode* newnode = SLTBuyNode(x);SLTNode* pre = *pphead;while (pre->next != pos){pre = pre->next;}pre->next = newnode;newnode->next = pos;}
}

 需要配合SLNodeFind一起使用。链表不能为空,指定的位置处的节点也不能为空;先看到else中的内容,若是指定的位置不是头节点,为传入的数据申请一个新节点,循环找到pos前的节点,让pre的next指针指向newnode,newnode的next指针指向pos,这样就让链表多了一个指定位置之前的节点;若是pos就是头节点此时不能直接走else里面的内容,因为pre找不到,最终会是空,此时直接引用头插方法。

相关测试:

  指定位置之后插入数据

//在指定位置之后插入数据
void SLTInsertBack(SLTNode* pos, SLTDataType x)
{assert(pos);SLTNode* newnode = SLTBuyNode(x);SLTNode* next = pos->next;pos->next = newnode;newnode->next = next;
}

不需要传头节点,因为不需要找到指定位置之前的节点,只需要pos和pos之后的节点,先把pos之后的节点给存起来,再让pos的next指向newnode,再让newnode的next指向原链表pos之后的节点。

删除指定位置的节点

//删除指定位置的数据
void SLTErase(SLTNode** pphead, SLTNode* pos)
{assert(pphead && *pphead);assert(pos);SLTNode* pre = *pphead;SLTNode* next = pos->next;if (pos == *pphead){SLTPopFront(pphead);}else{while (pre->next != pos){pre = pre->next;}free(pos);pos = NULL;pre->next = next;}
}

 同样地,如果pos就等于*pphead那么直接循环则找不到pre,这个时候直接调用头删的函数;若是正常情况下,则先找到pos之前的节点,再释放pos处的节点,最后让pre的next指向next的节点(也就是原链表中pro的next节点)。

 删除指定位置之后的节点

//删除指定位置之后的数据
void SLTEraseAfter(SLTNode* pos)
{assert(pos && pos->next);SLTNode* del = pos->next;pos->next = del->next;free(del);del = NULL;
}

 我们需要找到pos下一个和pos下下个的节点,因为删除了pos之后的节点之后要让pos的next指向pos的下下个节点;若是直接先 (pos->next=pos->next->next)再(free(pos->next)),这样会错误地删除原本链表中pos的下下个节点;

为了避免这种错误,我们先定义一个del节点存放要删除的节点,再让pos的next指向pos的下下个节点,最后删除del节点,因为此时的del的定义是在改变pos地next之前进行的,所以del代表的就是原链表pos的下一个节点并且不会改变,我们此时直接删除del不会对新链表造成破坏,这样就实现了该函数功能。

销毁单链表

//销毁单链表
void SLTDestroy(SLTNode** pphead)
{assert(pphead && *pphead);SLTNode* pcur = *pphead;//SLTNode* next = NULL;while (pcur){SLTNode* next = pcur->next;free(pcur);pcur = next;}*pphead = NULL;
}

 销毁单链表需要对其节点一个一个释放;我们对下面这个链表进行销毁并且调试观察;

 在链表尾插完之后在内存中是这样的:

在进行销毁的前一刻内存中是这样的:

销毁了三次之后:

销毁完节点并且让*pphead置为空之后:

 如此就完成了单链表的销毁。

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

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

相关文章

【MySQL05】【 undo 日志】

文章目录 一、前言二、undo 日志(回滚日志)1. 事务 id2. undo 日志格式2.1 INSERT 对应的 undo 日志2.2 DELETE 对应的 undo 日志2.3 UPDATE 对应的 undo 日志2.3.1 不更新主键2.3.2 更新主键 2.3 增删改操作对二级索引的影响2.4 roll_pointer 3. FIL_PA…

layui项目中的layui.define、layui.config以及layui.use的使用

第一步:创建一个layuiTest项目,结构如下 第二步:新建一个test.js,利用layui.define定义一个模块test,并向外暴露该模块,该模块里面有两个方法method1和method2. 第三步:新建一个test.html,在该页面引入layui.js&#x…

neo4j 图数据库:Cypher 查询语言、医学知识图谱

neo4j 图数据库:Cypher 查询语言、医学知识图谱 Cypher 查询语言创建数据查询数据查询并返回所有节点查询并返回所有带有特定标签的节点查询特定属性的节点及其所有关系和关系的另一端节点查询从名为“小明”的节点到名为“小红”的节点的路径 更新数据更新一个节点…

python爬虫和用腾讯云API接口进行翻译并存入excel,通过本机的Windows任务计划程序定时运行Python脚本!

项目场景: 提示:这里简述项目相关背景:定时爬取外网的某个页面,并将需要的部分翻译为中文存入excel 接下了的,没学过的最好看一下 基本爬虫的学习 【爬虫】requests 结合 BeautifulSoup抓取网页数据_requests beauti…

Vue CoreVideoPlayer 一款基于 vue.js 的轻量级、优秀的视频播放器组件

大家好,我是程序视点的小二哥!今天小二哥给大家推荐一款非常优秀的视频播放组件 效果欣赏 介绍 Vue-CoreVideoPlayer 一款基于vue.js的轻量级的视频播放器插件。 采用Adobd XD进行UI设计,支持移动端适配,不仅功能强大,颜值也是超一流! Vue-…

第一次构建一个对话机器人流程解析(二)

1. 问答机器人的组成-基于知识图谱的搜索 在教育场景下,若学生有关于学习内容的提问,或业务层面的提问,则要求问答机器人的回答必须精准,来满足业务的要求因此需要通过知识图谱来快速检索,所提内容的相关信息&#xf…

数字系统与进制转换

数字系统 数字逻辑是计算机科学的基础,它研究的是如何通过逻辑门电路(与门、或门、非门等)实现各种逻辑功能。数字系统则是由数字逻辑电路组成的系统,可以实现各种复杂的运算和控制功能。在计算机科学中,数字逻辑和数…

自定义波形图View,LayoutInflater动态加载控件保存为本地图片

效果图: 页面布局: <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="…

Kubernetes基于helm部署jenkins

Kubernetes基于helm安装jenkins jenkins支持war包、docker镜像、系统安装包、helm安装等。在Kubernetes上使用Helm安装Jenkins可以简化安装和管理Jenkins的过程。同时借助Kubernetes&#xff0c;jenkins可以实现工作节点的动态调用伸缩&#xff0c;更好的提高资源利用率。通过…

MySQL Innodb存储引擎中,当页默认的大小是16K时,页中最多存放多少行的记录?

1、题目引入 Innodb存储引擎是面向行的(row-oriented)&#xff0c;也就是说数据的存放按行进行&#xff0c;每页存放的行记录是有硬性定义的&#xff0c;当页默认的大小是16K时&#xff0c;页中最多存放多少行的记录&#xff1f; A、1600 行B、8192 行C、16383 行D、7992 行 …

基于Python协同过滤的旅游景点推荐系统,采用Django框架,MySQL数据存储,Bootstrap前端,echarts可视化实现

随着旅游业的迅速发展&#xff0c;个性化旅游推荐系统成为提升用户体验和促进旅游市场增长的重要工具。本研究旨在设计并实现一种基于Python协同过滤的旅游景点推荐系统&#xff0c;结合Django框架、MySQL数据库存储、Bootstrap前端框架以及echarts数据可视化技术&#xff0c;为…

【粉丝福利 | 第8期】值得收藏!推荐10个好用的数据血缘工具

⛳️ 写在前面参与规则&#xff01;&#xff01;&#xff01; ✅参与方式&#xff1a;关注博主、点赞、收藏、评论&#xff0c;任意评论&#xff08;每人最多评论三次&#xff09; ⛳️本次送书1~4本【取决于阅读量&#xff0c;阅读量越多&#xff0c;送的越多】 目前市面上绝…

数据迁移探索

概念 数据迁移是指将数据从一个计算环境或存储系统移动到另一个计算环境或存储系统。 随着公司业务的发展&#xff0c;出于成本优化、系统升级、分库分表、整合数据等原因。数据迁移工作在日常工作中会陆续出现。 我们可以将数据迁移分成两个部分&#xff0c;第一部分是数据…

springboot高职院校毕业生信息管理系统-计算机毕业设计源码27889

摘 要 基于Java语言开发的高职院校毕业生信息管理系统旨在提供一个便捷、高效的方式来管理毕业生的相关信息。系统包括学生基本信息管理、成绩管理、就业信息管理等模块&#xff0c;通过界面友好、操作简单的设计&#xff0c;方便管理员快速查询和更新学生信息。系统还提供数据…

采用前后端分离技术架构+java语言开发的全套产科信息管理系统源码 可与医院HIS、LIS、PACS、RIS等系统进行对接

采用前后端分离技术架构java语言开发的全套产科信息管理系统源码 可与医院HIS、LIS、PACS、RIS等系统进行对接 什么是产科信息管理系统-建档管理&#xff1f; 产科信息管理系统建档管理通过信息技术实现了孕产妇健康信息的电子化、网络化和智能化管理&#xff0c;提高了医疗服…

Riscv 架构的合规测试

为啥直接关注riscv-arch-test&#xff0c;是因为RISCOF 测试框架使用的是riscv-arch-test 1. The architectural test 架构测试是一个单一的测试&#xff0c;代表了可编译和运行的最小测试代码。它是用汇编代码编写的&#xff0c;其产品是test signature。一个架构测试可能由…

微信小程序推送消息java版

需求背景 使用springboot2微信小程序推送消息。百度了一下看了一篇文章整体还可以&#xff0c;这里推荐一下。 教程解析 1、微信平台开通订阅消息。 2、添加模板。 3、springboot后台接口开发 微信平台验证地址接口开发&#xff0c;然后部署到公网服务器。 4、微信平台验…

基于FPGA的数字信号处理(15)--定点数的舍入模式(6)向0取整fix

前言 在之前的文章介绍了定点数为什么需要舍入和几种常见的舍入模式。今天我们再来看看另外一种舍入模式&#xff1a;向上取整fix。 10进制数的fix fix&#xff1a;也叫 向0取整。它的舍入方式是数据往0的方向&#xff0c;舍入到最近的整数&#xff0c;比如1.75 fix到2&#xf…

将WordPress的文章重新排序的3个方法

有效的调整文章显示顺序看开可以更好突出内容&#xff0c;还可以保持网站的新鲜感&#xff0c;今天我将带您了解三种方法&#xff0c;通过重新排序文章显著提升网站的吸引力。我们将逐步讲解从调整设置到使用插件以及“置顶”文章的每一种方法&#xff0c;确保WordPress 新手也…

利用python进行数据分析 —— python正则表达式(持续更新中!)

文章目录 利用python进行数据分析 —— python基础知识进阶重点笔记&#xff1a;正则表达式re.match 匹配开头re.search 全文匹配re.sub 替换删除re.compile 编译正则findall 返回列表finditer 返回迭代器re.split 分割返回列表(?P...) 分组匹配正则表达符号、修饰符通配符1 ^…