C语言—双链表

一、双向链表的结构

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

二、双链表实现

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

(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.rhkb.cn/news/447484.html

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

相关文章

论新能源智能化电动车个性化(高定)产品对制造生产的影响

一、新能源智能化电动车高定体现模式 1.个性体现在品牌之间 在不同主机产产品上体现,例如国产新能源新势力在智能座舱、内饰配置(冰箱、彩电、大沙发)方面对于合资品牌的碾压,提供更多细分,功能拉满的车型。 2.个性化…

PHP校园帮一键触达便捷无限小程序系统源码

校园帮小程序 —— 校园生活一键触达,便捷无限 🚀📱 🏫 一、校园生活新助手:校园帮小程序登场 在繁忙的校园生活中,你是否曾为找不到便捷的服务而烦恼?别担心,校园帮小程序来啦&am…

一篇闪击常用放大器电路(学习笔记)

文章目录 声明概念名词经典电路分析反向放大器同向放大器加法器减法器积分电路微分电路差分放大电路电流->电压转换电路电压->电流转换电路 虚短与虚断一、虚短二、虚断 一些碎碎念 声明 ​ 本文是主要基于以下两篇博客所做的笔记: 模电四:基本放…

端口号和netstat以及pidof

端口号 端口号(Port)标识了一个主机上进行通信的不同的应用程序 在TCP/IP协议中, 用 "源IP", "源端口号", "目的IP", "目的端口号", "协议号" 这样一个五元组来标识一个通信(可以通过netstat -n查看) 端口号范围划分 0 …

间隙波导2 用于宽带间隙波导技术的合适鲁棒性的嵌入式销钉床

摘要: 本文引入了一种新型的以嵌入式钉床形式的少接触电磁带隙结构。与传统的钉床结构相比,起初用于提供完美电导体边界的光滑的上层金属平面由周期缺口槽代替,并且在底层模块嵌入这些槽中的金属探针没有任何电接触。嵌入式EBG结构的优点之一…

pytorch学习笔记

文章目录 前言一、What is PyTorch二、Training Neural Networks三、Training&Testing Neural Networks四、Tensors五、Training&Testing Neural Networks六、torch.nn七、Neural Network Training Setup总结 前言 PyTorch 是一个流行的深度学习框架,具有动…

实战篇:(三)项目实战Vue 3 + WebGL 创建一个简单的 3D 渲染应用

Vue 3 WebGL 创建一个简单的 3D 渲染应用 我们将使用 Vue 3 和 WebGL 创建一个简单的 3D 渲染应用。项目将展示如何在 Vue 组件中集成 WebGL,并渲染一个旋转的立方体。 1. 项目准备 首先,确保你已经安装了 Node.js 和 Vue CLI。如果还没有安装&#x…

解密京东详情 API 接口:获取与运用指南

一、什么是京东详情API接口? 京东详情API接口是京东开放平台提供的一种服务,允许开发者通过编程方式获取商品的详细信息。通过调用这个接口,你可以获取到商品的基本信息、价格、库存、评价等数据。这些数据可以帮助你更好地了解商品的情况&a…

基于WebSocket实现简易即时通讯功能

代码实现 pom.xml <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency><groupId>org.springframework.boot</groupId><artifa…

2024最新分别用sklearn和NumPy设计k-近邻法对鸢尾花数据集进行分类(包含详细注解与可视化结果)

本文章代码实现以下功能&#xff1a; 利用sklearn设计实现k-近邻法。 利用NumPy设计实现k-近邻法。 将设计的k-近邻法对鸢尾花数据集进行分类&#xff0c;通过准确率来验证所设计算法的正确性&#xff0c;并将分类结果可视化。 评估k取不同值时算法的精度&#xff0c;并通过…

HTML CSS 基础

HTML & CSS 基础 HTML一、HTML简介1、网页1.1 什么是网页1.2 什么是HTML1.3 网页的形成1.4总结 2、web标准2.1 为什么需要web标准2.2 Web 标准的构成 二、HTML 标签1、HTML 语法规范1.1基本语法概述1.2 标签关系 2、 HTML 基本结构标签2.1 第一个 HTML 网页2.2 基本结构标签…

uniapp 游戏 - 使用 uniapp 实现的扫雷游戏

0. 思路 1. 效果图 2. 游戏规则 扫雷的规则很简单。盘面上有许多方格,方格中随机分布着一些雷。你的目标是避开雷,打开其他所有格子。一个非雷格中的数字表示其相邻 8 格子中的雷数,你可以利用这个信息推导出安全格和雷的位置。你可以用右键在你认为是雷的地方插旗(称为标…

中华春节符号·世界品牌——粤港澳企(实)业协会商会经济合作座谈会成功举办

日前&#xff0c;一场旨在推动粤港澳三地经济深度合作的盛会——《粤港澳企&#xff08;实&#xff09;业协会商会经济合作座谈会》在广州市天河区时代TIT广场2栋801车陂社区文化中心隆重举行。此次活动由泰康之家粤园与广东经贸文化促进会联合主办&#xff0c;吸引了全球华人企…

Dubbo SpringBoot应用创建和K8S部署

推荐阅读&#xff1a;Dubbo 快速入门-CSDN博客 创建基于Spring Boot的微服务应用 以下文档将引导您从头创建一个基于 Spring Boot 的 Dubbo 应用&#xff0c;并为应用配置 Triple 通信协议、服务发现等微服务基础能力。 快速创建应用 以下是我们为您提前准备好的示例项目&am…

AI大模型开发架构设计(12)——以真实场景案例驱动深度剖析 AIGC 新时代 IT 人的能力模型

文章目录 以真实场景案例驱动深度剖析 AIGC 新时代 IT 人的能力模型1 AI 工具以及大模型会给我们带来哪些实际收益?业务研发流程环节为什么 LLM 大模型不是万能的?LLM 大模型带来实际收益 2 新时代IT人的能力模型会发生哪些变化?古典互联网架构师能力模型IT人能力模型变化 以…

这都能封!开发者行为导致Google账号关联?

从去年10月开始&#xff0c;在AI加持下&#xff0c;Google Play不断更新和迭代审查机制&#xff0c;Google Play在最近一年的时间真是杀疯了&#xff0c;封号的声音响彻整个行业&#xff0c;尤其是一些敏感品类行业。账号关联&#xff0c;恶意软件&#xff0c;欺骗行为&#xf…

小红书新ID保持项目StoryMaker,面部特征、服装、发型和身体特征都能保持一致!(已开源)

继之前和大家介绍的小红书在ID保持以及风格转换方面相关的优秀工作&#xff0c;感兴趣的小伙伴可以点击以下链接阅读~ 近期&#xff0c;小红书又新开源了一款文生图身份保持项目&#xff1a;StoryMaker&#xff0c;是一种个性化解决方案&#xff0c;它不仅保留了面部的一致性&…

贪吃蛇游戏(代码篇)

我们并不是为了满足别人的期待而活着。 前言 这是我自己做的第五个小项目---贪吃蛇游戏&#xff08;代码篇&#xff09;。后期我会继续制作其他小项目并开源至博客上。 上一小项目是贪吃蛇游戏&#xff08;必备知识篇&#xff09;&#xff0c;没看过的同学可以去看看&#xf…

Angular Count-To 项目教程

Angular Count-To 项目教程 angular-count-to Angular directive to animate counting to a number 项目地址: https://gitcode.com/gh_mirrors/an/angular-count-to 1. 项目介绍 Angular Count-To 是一个用于 AngularJS 的动画计数器指令。该指令可以在指定的时间内从…

Lfsr32

首先分析 Lfsr5 首先要理解什么是抽头点&#xff08;tap&#xff09;&#xff0c;注意到图中有两个触发器的输入为前级输出与q[0]的异或&#xff0c;这些位置被称为 tap position.通过观察上图&#xff0c;所谓抽头点指的就是第5个&#xff0c;第3个寄存器的输入经过了异或逻辑…