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

一:双向链表的概念

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

二:双向链表的实现
第一点:
本文采用三个文件进行实现
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函数进行一系列测试的运行结果:

头文件的展示:

 

 

 

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

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

相关文章

Pycharm中安装tablepyxl失败

tablepyxl是一个存在的 Python 包&#xff0c;它是一个桥接 HTML 表格和 openpyxl 的工具&#xff0c;允许你将 HTML 表格转换成 Excel 工作簿。如果你想在 conda 环境中安装 tablepyxl&#xff0c;可以按照以下步骤进行&#xff1a; &#xff08;1&#xff09;打开conda终端。…

GIS数据—1984-2020中国1km人造夜间灯光观测数据

夜间灯光观测数据&#xff08;Nighttime Light,NTL&#xff09;是评估人类活动边界的常用手段&#xff0c;目前&#xff0c;该数据已经广泛应用于城市范围、不透水面、基础设施建设等一系列过程。今天&#xff0c;小编要带来的是长时间序列中国区域边界的夜间灯光观测数据。 数…

springcloud -nacos实战

一、nacos 功能简介 1.1.什么是Nacos&#xff1f; 官方简介&#xff1a;一个更易于构建云原生应用的动态服务发现(Nacos Discovery )、服务配置(Nacos Config)和服务管理平台。 Nacos的关键特性包括&#xff1a; 服务发现和服务健康监测动态配置服务动态DNS服务服务及其元数…

C++语法|explicit关键字

文章目录 1.C的隐式对象转换问题举例产生的问题 2.使用explicit解决上述问题总结 1.C的隐式对象转换问题 在C中&#xff0c;隐式对象转换&#xff08;Implicit Object Conversion&#xff09;指的是编译器在不需要程序员明确指示的情况下&#xff0c;自动将对象从一种类型转换…

VMware配置Kali linux + 物理机连接Xshell

VMware 配置 kali linux 首先需要先安装VMware Workstation 我是在Windows 安装的 VMware Workstation Pro 17 虚拟化&#xff0c;产品密钥。。这里不做多说了 下载kali linux 这里我下载的是kali-linux-2024.1 Note&#xff1a;这里选Virtual Machines&#xff0c;建议不要…

景源畅信:抖音小店的商品怎么同步到橱窗?

在数字营销的海洋中&#xff0c;抖音小店与橱窗的同步操作无疑是商家们关注的焦点。这不仅能增加商品的曝光度&#xff0c;还能提高交易的可能性。那么&#xff0c;如何将抖音小店的商品同步到橱窗呢? 一、核心步骤解析 要实现商品从抖音小店同步到橱窗&#xff0c;你需要确保…

【Linux 网络】网络编程套接字 -- 详解

⚪ 预备知识 1、理解源 IP 地址和目的 IP 地址 举例理解&#xff1a;&#xff08;唐僧西天取经&#xff09; 在 IP 数据包头部中 有两个 IP 地址&#xff0c; 分别叫做源 IP 地址 和目的 IP 地址。 如果我们的台式机或者笔记本没有 IP 地址就无法上网&#xff0c;而因为…

Unity引擎是什么?有哪些优点

大家好&#xff0c;我是咕噜土豆&#xff0c;很高兴又和大家见面了。今天我们一起来了解一下Unity引擎和它有哪些优点。 首先带大家了解什么是Unity引擎 Unity引擎是一款由Unity Technologies开发的跨平台游戏开发引擎&#xff0c;广泛用于创建2D和3D游戏以及其他交互式内容&…

C++动态内存区域划分、new、delete关键字

目录 一、C/C中程序的内存区域划分 为什么会存在内存区域划分&#xff1f; 二、new关键字 1、内置类型的new/delete使用方法&#xff1a; 2、new和delete的本质 一、C/C中程序的内存区域划分 为什么会存在内存区域划分&#xff1f; 因为不同数据有不同的存储需求&#xff0…

【SpringBoot记录】从基本使用案例入手了解SpringBoot-数据访问(1)

前言 在程序开发尤其是网页应用开发中&#xff0c;数据访问是必不可少的。通过前面的基本案例我们完成了一个简单的SpringBoot Web应用并对自动配置原理有了一定了解&#xff0c;本节在上述案例基础上&#xff0c;继续编写数据访问案例&#xff0c;将通过SpringBoot中数据访问…

音视频开发6 音视频录制原理和播放原理

音视频录制原理 音视频播放原理

VO、PO、DTO的区别

VO&#xff1a;值对象&#xff0c;用于视图层&#xff0c;它的作用是把某个指定页面&#xff08;或组件&#xff09;的所有数据封装起来。 PO&#xff1a;持久化对象&#xff0c;它跟持久层&#xff08;通常是关系型数据库&#xff09;的数据结构形成一一对应的映射关系&#…

# 电脑突然连接不上网络了,怎么办?

电脑突然连接不上网络了&#xff0c;怎么办&#xff1f; 一、原因分析&#xff1a; 1、IP 地址冲突 2、DNS 解析出现问题。 3、电脑网络设置是否打开了【移动热点】或【飞行模式】。 4、【WLAN AutoConfig】服务是否打开。 5、无线网卡驱动损坏。 6、检查 WIFI 开关是否…

java线程池源码解析:ThreadPoolExecutor源码,execute方法、addWorker方法解析

1. 概述 线程池 的作用不用太说了&#xff0c;线程池会按照一定的规则&#xff0c;创建和维护一定数量的线程。这些线程可以被循环利用&#xff0c;来处理用户提交的任务。对比不同线程池的使用方式&#xff0c;节省了频繁的创建和销毁线程带来的性能开销。 2. 概念理解 2…

从FasterTransformer源码解读开始了解大模型(2.0)代码通读01

从FasterTransformer源码解读开始了解大模型&#xff08;2.0&#xff09;代码解读01-看看头文件 写在前面的话 本篇的内容直接开始我们的代码通读&#xff0c;整个通读可能需要好几篇文章来将一整个gpt的代码结构给讲清楚。目前的计划是先从整体model层次开始讲&#xff0c;将…

Java8 Stream API在集合上执行复杂的数据处理查询

Java 8 引入的 Stream API 是一个高级工具&#xff0c;用于在集合上执行复杂的数据处理查询。Stream API 通过提供一系列的中间操作和最终操作&#xff0c;支持声明式处理&#xff08;类似于SQL声明式语句&#xff09;并且可以轻松使用多核架构。 创建Stream流 创建Stream 流…

HTML+VUE3组合式+ELEMENT的容器模板示例(含侧栏导航,表格,...)

一个简单的在html中使用Vue3及Element-plus vue-icons的整合示例&#xff1a; 一、示例截图 二、文件代码 直接复制到html文件在浏览器打开即可预览 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title&g…

CCleaner系统优化与隐私保护工具,中文绿色便携版 v6.23.11010

01 软件介绍 CCleaner 是一款高级的系统优化工具&#xff0c;其设计宗旨在于彻底清理 Windows 操作系统中积累的无用文件和冗余的注册表项。此举旨在显著提升计算机的运行效率并回收磁盘空间。该软件拥有高效的能力&#xff0c;可以清除包括临时文件、浏览器缓存及其历史记录在…

哪些设计模式,你使用过哪些设计模式

Java框架中运用了多种设计模式&#xff0c;以下是一些具体的例子以及它们在框架中的应用&#xff1a; 单例模式&#xff08;Singleton Pattern&#xff09;&#xff1a; 确保一个类只有一个实例&#xff0c;并提供全局访问点。例如&#xff0c;Java中的Runtime类使用了单例模式…

08 - hive的集合函数、高级聚合函数、炸裂函数以及窗口函数

目录 1、集合函数 1.1、size&#xff1a;集合中元素的个数 1.2、map&#xff1a;创建map集合 1.3、map_keys&#xff1a; 返回map中的key 1.4、map_values: 返回map中的value 1.5、array 声明array集合 1.6、array_contains: 判断array中是否包含某个元素 1.7、sort_a…