C语言—双链表

news2024/10/12 14:07:06

一、双向链表的结构

注意:这⾥的“带头”跟前⾯我们说的“头节点”是两个概念,实际前⾯在单链表阶段称呼不严谨,带头链表⾥的头节点,实际为“哨兵位”,哨兵位节点不存储任何有效元素,只是站在这⾥“放哨的”。
“哨兵位”存在的意义:遍历循环链表避免死循环。

二、双链表实现

注意:这里实现的双链表是指双向带头循环链表

(2.1)基本结构定义

为了双链表的复用性,这里将 int 重命名为LTDataType,后面如果要存储别的数据类型只需要将int更改就可以(自定义类型除外,自定义类型有些函数需要进行一定程度的修改),双链表节点中有一个数据域存储数据,两个指针域,其中 next 存储后继节点,prev 存储前驱节点,这里为了后面使用方便还将结构体类型重命名为LTNode。

(2.2)初始化链表

实现思路:该函数只需要一个参数,即指向头指针的二级指针,之所以用二级指针是因为我们实现的是带头双向循环链表,所以我们需要在该函数中申请一块不存储有效数据的空间,用来作为整个链表的头,并且让链表的头指针指向它,所以我们需要通过形参来实现改变链表头指针指向,所以需要传址调用,而这里的传址传的是头指针的地址,所以用二级指针。初始化时只有一个头节点,所以让它的 next 指针和 prev 指针都指向自己。

具体实现:

(2.3)打印数据

实现思路:因为打印链表数据,所以形参需要链表的头指针,因为头结点是不存储有效数据的,所以循环打印链表数据的时候可以从头节点的下一个节点开始循环,链表是循环的,当遍历回头节点的时候就说明所有有效节点都打印一遍了,而头节点又没有有效数据,所以当遍历到头节点的时候就退出循环。

具体实现:

(2.4)申请新节点

实现思路:先用动态内存申请函数申请出节点大小的空间,然后判断是否申请成功,申请失败报错,申请成功将数据插入,并将 next 指针和 prev 指针都指向自己,最后将申请成功的节点地址返回。(形参是要插入的数据)

具体实现:

(2.5)头部插入删除数据/尾部插入删除数据

(2.5.1)尾部插入

实现思路:该函数需要两个形参,一个用来找到链表的头指针,一个要插入的数据,在函数中调用前面写好的申请节点的函数申请新节点,然后就可以将节点插入链表尾部了,插入节点的写法可以有很多种,如果用下面的方法插入,前两句的顺序无所谓,但是后面两句顺序不可以改变,否则就会出问题。因为按照下图的写法,第三句(52行)中,phead的prev是原链表的尾节点,这句话的意思是让原链表的尾节点的next指针指向新节点,然后再让phead的prev指针指向新节点,这样新节点就成为了新的尾节点,如果交换顺序,先执行第四句,再执行第三句,phead的prev指针就指向新节点了,就不指向原来的尾节点了,那这句话中的next指针就是新节点的next指针而不是原链表尾节点的next指针。

具体实现:

(2.5.2)头部插入

实现思路:该函数需要两个参数,一个用来找到链表的头指针,一个要插入的数据,后面和尾插思路很像,先申请新节点,然后再插在原链表头后面就可以了,还是62,63两行顺序无所谓,64,65两行顺序不能改变。(注意:这是双向带头循环链表,头部插入是指插入在固定的头的后面,而不是插入一个新的头节点)

具体实现:

(2.5.3)尾部删除

实现思路:该函数只需要一个参数,即可以找到链表的头指针即可。因为链表是循环的,所以很容易就可以找到尾节点,就是头节点的前驱节点,我们可以先将要删除的节点用一个临时变量记录下来,先不要着急删除,先将删除节点会影响到的指针域进行重新赋值,然后再删,用临时变量记录要删除的节点避免了因为指针域的改变而找不到要删除的节点。

具体实现:

(2.5.4)头部删除

实现思路:该函数只需要一个形参,即可以找到链表的头指针,头删和尾删的思路很像,先定义一个临时变量记录要删除的节点,然后改变因删除节点受到影响的指针,最后释放节点,需要注意的是这里的头删指的是删除表头的后一个节点。

具体实现:

(2.6)查找

实现思路:该函数需要两个形参,一个用来找到链表的头指针,一个要查找的数据,因为双链表的头节点不存储有效数据,所以我们可以从头节点的下一个节点开始遍历,双链表是循环链表,所以当遍历回头节点的时候说明所有节点都已经遍历一次了,如果还没有找到,就需要退出循环,返回NULL。

具体实现:

(2.7)在pos位置之后插入数据

实现思路:这个函数可以配合查找使用,实现思路和头插,尾插很像,注意一下连接节点时的连接顺序即可。

具体实现:

(2.8)删除pos位置的数据

实现思路:先将pos的前后节点连接上,在释放pos即可。

具体实现:

(2.9)销毁链表

实现思路:我们可以从头节点的后一个节点开始循环删除,在释放当前节点前先将后继节点记录下来,防止释放后找不到,当除头节点外的所有节点都删除后再删除头节点,并将头指针置空。

具体实现:

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

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

相关文章

desmos和webgl绘制线条

目录 desmos绘制 webgl绘制 将线段坐标生成三角化坐标 处理斜接线段 处理圆角 尖角 先在desmos上面完成线条lineJoin绘制的,再将代码和公式转到js用webgl绘制. desmos绘制 示例 desmos计角斜接角时,需要用到的一些函数。在desmos定义成公共函数&#xff0c…

[含文档+PPT+源码等]精品基于springboot实现的原生Andriod心理健康辅导平台

基于Spring Boot实现的原生Android心理健康辅导平台,其背景可以从以下几个方面进行详细阐述: 一、技术背景 Spring Boot框架:Spring Boot是Spring框架的一个子集,它通过自动配置、简化依赖管理、内嵌容器等特性,极大…

登录前端笔记(一):pinia管理用户数据

一、把pinia加入到项目文件里 ①、npm install pinia ②mian.ts //①导入createPinia import { createPinia } from pinia //②执行方法得到实例 const pinia createPinia() //③把pinia实例加入到APP应用里 app.use(pinia)二、官网简单实例(定义store【state与ac…

Stylized Far East 古代国风建筑城镇宫殿场景模型

古代国风建筑城镇宫殿场景模型。内容: -演示场景(截图) - 种类繁多的建筑,如宫殿、商店、神社、房屋、餐馆、宝塔、寺庙等 -带有塔楼、门楼的模块化城堡墙 -树木、岩石、悬崖和其他自然资产 -传统装饰,如纸灯笼、绘画、瓷器等 - 城镇道具,如手推车、栅栏、板条箱、市场、…

Redis-缓存一致性

缓存双写一致性 更新策略探讨 面试题 缓存设计要求 缓存分类: 只读缓存:(脚本批量写入,canal 等)读写缓存 同步直写:vip数据等即时数据异步缓写:允许延时(仓库,物流&a…

el-carousel-item自动重复渲染,使用nanoid让重复的元素包含不同的id

<template><div class"page-container"><div class"m-title">轮播图</div><el-carousel height"400px" :autoplay"true"><el-carousel-item v-for"(item, index) in carouselList" :key&…

AOT漫谈专题(第二篇): 如何对C# AOT轻量级APM监控

一&#xff1a;背景 1. 讲故事 上一篇我们聊到了如何调试.NET Native AOT 程序&#xff0c;这是研究一个未知领域知识的入口&#xff0c;这篇我们再来看下如何对 Native AOT 程序进行轻量级的APM监控&#xff0c;当然这里的轻量级更多的是对 AOT 中的coreclr内容的挖掘。 二…

面试官最喜欢问的28道ZooKeeper面试题

前言 ZooKeeper 是一个分布式的&#xff0c;开放源码的分布式应用程序协调服务。它是一个为分布式应用提供一致性服务的软件&#xff0c;提供的功能包括&#xff1a;配置维护、域名服务、分布式同步、组服务等。 ZooKeeper 的目标就是封装好复杂易出错的关键服务&#xff0c;…

再也不怕面试官问我几百亿ip相关的问题了

首先要明确这一类的问题都是海量那个数据类型的问题&#xff0c;对于海量数据我们一般采用分而治之的思路去解决&#xff0c;考官考察的就是你有没有处理海量数据的经验。总结几个常见的海量数据相关的面试&#xff0c;供参考。 有一个存放10GB的ip地址文件&#xff0c;每行一…

2024年【安全生产监管人员】免费试题及安全生产监管人员模拟试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年安全生产监管人员免费试题为正在备考安全生产监管人员操作证的学员准备的理论考试专题&#xff0c;每个月更新的安全生产监管人员模拟试题祝您顺利通过安全生产监管人员考试。 1、【单选题】()以上地方人民政府…

基于SSM的民宿预订系统的设计与实现

文未可获取一份本项目的java源码和数据库参考。 一、毕业设计&#xff08;论文&#xff09;选题的目的和意义 由于现代人经济水平的不断提高&#xff0c;出门旅游已经成为人们放松和休息的一种生活方式。而出门在外&#xff0c;住宿也是首要问题&#xff0c;相比于传统的酒店…

五子棋项目自动化测试

目录 一、五子棋项目介绍 二、编写Web测试用例 三、自动化测试脚本开发 1、引入依赖 2、设计框架 3、Utils 4、LoginPage 5、RegisterPage 6、MatchPage 7、RunTest类 8、运行程序 一、五子棋项目介绍 五子棋项目是基于 WebSocket 实现的多人在线对战系统&#xff0…

【优选算法】(第三十六篇)

目录 ⼆叉树的锯⻮形层序遍历&#xff08;medium&#xff09; 题目解析 讲解算法原理 编写代码 ⼆叉树的最⼤宽度&#xff08;medium&#xff09; 题目解析 讲解算法原理 编写代码 ⼆叉树的锯⻮形层序遍历&#xff08;medium&#xff09; 题目解析 1.题目链接&#xf…

【高中生讲机器学习】21. 隐马尔可夫模型好难?看过来!(下篇)

创建时间&#xff1a;2024-10-09 首发时间&#xff1a;2024-10-12 最后编辑时间&#xff1a;2024-10-12 作者&#xff1a;Geeker_LStar 你好呀~这里是 Geeker_LStar 的人工智能学习专栏&#xff0c;很高兴遇见你~ 我是 Geeker_LStar&#xff0c;一名高一学生&#xff0c;热爱计…

SpringBoot购物推荐网站:设计与实现的最佳实践

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常适…

『深度分析』Kimi版o1来了!Kimi探索版全面解读!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;专注于分享AI全维度知识&#xff0c;包括但不限于AI科普&#xff0c;AI工…

28幅高清修复的英文版中国地图

我们在《183幅值得珍藏的全国地质图集》和《55幅值得珍藏的水文地质图集》两文中&#xff0c;为你分享过精美的全国地质图和水文地质图。 现在我们整理了28幅英文版中国地图&#xff0c;并经过高清修复后分享给大家&#xff0c;你可以在文末查看该数据的领取方法。 28幅英文版…

Channel模块 --- 管理套接字事件

目录 设计思想 实现 设计思想 Channel模块是用于对一个描述符所需要监控的事件以及事件触发之后要执行的回调函数进行管理的 具体来说&#xff0c;它里面会保存该文件描述符所监控的事件&#xff0c;该文件描述符所就绪的事件&#xff0c;以及该描述符的各种事件的处理回调…

4 机器学习之归纳偏好

通过学习得到的模型对应了假设空间中的一个假设。于是&#xff0c;图1.2的西瓜版本空间给我们带来一个麻烦&#xff1a;现在有三个与训练集一致的假设&#xff0c;但与它们对应的模型在面临新样本的时候&#xff0c;却会产生不同的输出。例如&#xff0c;对&#xff08;色泽青绿…

java算法oj(3)栈和队列

目录 1.前言 2.正文 2.1基础操作 2.2用栈实现队列 2.2.1题目 2.2.2示例 2.2.3代码 2.3用队列实现栈 2.3.1题目 2.3.2示例 2.3.3代码 2.4最小栈 2.4.1题目 2.4.2示例 2.4.3代码 3.小结 1.前言 哈喽大家好吖&#xff0c;今天来分享几道栈与队列的算法题&#…