带头双向循环链表(数据结构初阶)

news2025/1/16 6:31:45

文章目录

  • 双向链表
    • 链表的分类
    • 概念与结构
    • 实现双向链表
      • 定义链表结构
      • 链表打印
      • 判空
      • 申请结点
      • 初始化
      • 头插尾插
      • 头删尾删
      • 查找
      • 指定位置插入和删除
      • 销毁链表
    • 顺序表和链表的分析
    • 结语

欢迎大家来到我的博客,给生活来点impetus!!
在这里插入图片描述
这一节我们学习双向链表(数据结构初阶)

双向链表

链表的分类

在这里插入图片描述

概念与结构

在这里插入图片描述

注意:这⾥的“带头”跟前⾯我们说的“头结点”是两个概念,实际前⾯的在单链表阶段称呼不严谨,但是为了同学们更好的理解就直接称为单链表的头结点。

带头链表⾥的头结点,实际为“哨兵位”,哨兵位结点不存储任何有效元素,只是站在这⾥“放哨的”。

单链表存储的数据都是有效的,事实上,他是不存在头结点的

单链表为空时是NULL
双向链表为空时此时表中仍然有哨兵位结点

当链表为NULL,双向链表如下图:
在这里插入图片描述

实现双向链表

定义链表结构

双向链表既要能够存储数据,又要存储下一个和上一个结构体的地址
这样才能找到这个结构体。
在这里插入图片描述

链表打印

涉及链表打印,就一定涉及链表的遍历,双向链表的遍历与单链表存在区别
在这里插入图片描述
下面画图演示过程:
在这里插入图片描述

细节:1:判决条件 2:pcur的设立(phead的下一个结点)

判空

判空时在删除结点的时候十分有用。
可能你会问,和直接写while(pcur!=NULL)有区别吗
在这里插入图片描述

在该处的双向链表中为空,此时表中有头结点,不为NULL,判空就得改变
写为assert(!LTEmpty);
若写为while(pcur!=NULL),语句允许把双向链表把哨兵位删除,此时就不在是双向链表了

申请结点

在这里插入图片描述

细节:malloc函数开辟是否成功,注意需要判断。

初始化

初始化具有两种思路:

1:先开辟结点,再来改变指针指向,不返回。
2:开辟结点改变指针指向一并完成,返回结点。

在这里插入图片描述

这里推荐使用第二种方法

头插尾插

尾插
在这里插入图片描述

需要先修改newnode,再修改原链表

头插
在这里插入图片描述

我们先修改newnode,再修改原链表

通过对比发现,为什么头插是在phead结点后面插入,而不是在phead结点之前插入?
因为在phead结点之前插入,就等价于尾插了

头删尾删

尾删
在这里插入图片描述

头删
在这里插入图片描述

头删和尾删断言的内容不在是判断空,而是判断是不是哨兵结点

前面我们已经说明,链表为空时为真,返回1,但是assert断言需要停止,就需要添加一个非(!)。不要被绕晕了。

查找

在这里插入图片描述

此处的查找为了给后面pos位置插入删除做铺垫,pos位置插入和删除就可以省去遍历的步骤了

指定位置插入和删除

在这里插入图片描述
pos之前插入数据与pos之后插入数据十分相同,如下:
在这里插入图片描述
指定位置删除数据。
在这里插入图片描述

销毁链表

在这里插入图片描述

此时我们发现,前方都是一级指针,销毁是二级指针,为了保证接口一致性,我们改为一级指针,,font color = red>函数调用完成后,手动free。

在这里插入图片描述

最后我们来总结一下细节:
1:双向链表为空时,只有一个哨兵位
2:双向链表进行操作时传递的一定为一级指针,因为哨兵位不能改变
3:注意分析对结点操作时受影响的节点或成员
4:插入结点时一定要先对newnode的指针进行操作
5:头插是在哨兵位后面插入
6:遍历时注意pcur的起始位置判决条件
7:销毁与删除的区别前者没有任何节点,后者一定有头结点
8:pos不可能为哨兵位,该结点存储数据无效
9:节点与数组不同的点:数组是连续的地址,结点的地址是不连续的

顺序表和链表的分析

在这里插入图片描述

当只用用来存储数据,不用任意位置插入删除,会使用顺序表
当需要频繁修改结点,任意位置插入或删除,使用链表

结语

感谢大家阅读我的博客,欢迎大家有新的知识点向我补充,也欢迎大家纠正我的错误,路漫漫其修远兮,吾将上下而求索,加油!!陌生人!!!在这里插入图片描述

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

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

相关文章

在eNSp上telnet一下吧

在上篇博客:DNS 我们提到了telnet和设备带外管理、带内管理,它确实是非常有趣的一个知识点哦,接下来我们一起来学习学习吧~ Telnet(远程登陆协议) Telnet基于TCP 23号端口,典型的C/S架构模式,是…

Spring MVC复杂数据绑定-绑定集合

【图书介绍】《SpringSpring MVCMyBatis从零开始学(视频教学版)(第3版)》_【新华文轩】springspring mvcmybatis从零开始学(视频教学版) 第3版 正版-CSDN博客 《SpringSpring MVCMyBatis从零开始学(视频教学版)(第3版…

基于禁忌搜索算法的TSP问题最优路径搜索matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于禁忌搜索算法的TSP问题最优路径搜索,旅行商问题(TSP)是一个经典的组合优化问题。其起源可以追溯到 19 世纪初,…

静态综合路由实验

实验拓扑 实验要求 1.除R5的环回地址外,整个其他所有网段基于192.168.1.0/24进行合理的IP地址划分 2.R1-R4每个路由器存在两个环回接口,用于模拟pc网段;地址也在192.168.1.0/24这个网络范围内 3.R1-R4上不能直接编写到达5.5.5.0/24的静态路由…

前端组件开发:组件开发 / 定义配置 / 配置驱动开发 / 爬虫配置 / 组件V2.0 / form表单 / table表单

一、最早的灵感 最早的灵感来自sprider / 网络爬虫 / 爬虫配置,在爬虫爬取网站文章时候,会输入给爬虫一个配置文件,里边的内容是一个json对象。里边包含了所有想要抓取的页面的信息。爬虫通过这个配置就可以抓取目标网站的数据。其实本文要引…

[Deep Learning] Anaconda+CUDA+CuDNN+Pytorch(GPU)环境配置-2025

文章目录 [Deep Learning] AnacondaCUDACuDNNPytorch(GPU)环境配置-20250. 引子1. 安装Anaconda1.1 安装包下载:1.2 启用安装包安装1.3 配置(系统)环境变量1.4 验证Anaconda是否安装完毕1.5 Anaconda换源 2. 安装CUDACuDNN2.1 判断本机的CUDA版本2.2 下载适合自己CU…

直播预告丨Arxiv Insight:用 AI 重新定义论文检索

1月16日晚上20:00-20:50,Zilliz直播间,深圳大学计算机视觉所硕士牛增豪先生将带来《Arxiv Insight:用 AI 重新定义论文检索》分享,届时他将讲述从零到一构建 Arxiv Insight产品的过程,思考以及未来计划。欢迎大家锁定Z…

STM32 FreeRTOS 的任务挂起与恢复以及查看任务状态

目录 任务的挂起与恢复的API函数 任务挂起函数 任务恢复函数 任务恢复函数(中断中恢复) 函数说明 注意事项 查看任务状态 任务的挂起与恢复的API函数 vTaskSuspend():挂起任务, 类似暂停,可恢复 vTaskResume()&#xff1a…

4. 使用springboot做一个音乐播放器软件项目【数据库表的创建】

上一章文章 我们做了音乐播放器 这个项目一些公共封装的一些工具类。参考网址: https://blog.csdn.net/Drug_/article/details/145093705 那么这篇文章 我们开始创建数据表。来存储我们项目中所需要存储的数据。 对于 我们这个项目 版本一 需要开发的核心功能 在 第…

leetcode刷题记录(五十四)——560. 和为 K 的子数组

(一)问题描述 560. 和为 K 的子数组 - 力扣(LeetCode)560. 和为 K 的子数组 - 给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。子数组是数组中元素的连续非空序列。 示例 1&am…

软考,质量管理。

项目质量管理,PMBOOK 质量是满足需求的能力的特性的总结 需求的满足程度 质量通常是指产品的质量,广义上的质量还包括工作质量。产品质量是指产品的使用价值及其属性;而工作质量则是产品质量的保证,它反映了与产品质量直接有关的…

Re78 读论文:GPT-4 Technical Report

诸神缄默不语-个人CSDN博文目录 诸神缄默不语的论文阅读笔记和分类 论文全名:GPT-4 Technical Report 官方博客:GPT-4 | OpenAI appendix懒得看了。 文章目录 1. 模型训练过程心得2. scaling law3. 实验结果减少风险 1. 模型训练过程心得 模型结构还…

LeetCode | 图文详细描述动态规划DP算法及经典题型

本文将用简单直白的方式,从零开始带你掌握动态规划的精髓。你会发现: 动态规划其实没那么难——它就是递归的“记性”版。状态转移方程不再玄学——从题目思路到实现,手把手教你推导。经典题型剖析——从“爬楼梯”到“背包问题”&#xff0…

学习threejs,使用RollControls相机控制器

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.RollControls 相机控…

期权懂|场内期权合约行权价格是如何设定制度的?

锦鲤三三每日分享期权知识,帮助期权新手及时有效地掌握即市趋势与新资讯! 场内期权合约行权价格是如何设定制度的? 场内期权合约的行权价格是期权合约中的一个关键要素,它决定了期权买方在期权到期日或之前买入(对于…

设计模式相关面试

设计模式 工厂方法模式 简单工程模式 工厂方法设计模式 抽象工厂设计模式 工厂方法小结 策略模式 案例(工厂模式策略模式) 责任链设计模式 概述 常见使用方式 常见技术场景 单点登录如何实现 权限认证如何实现 上传数据的安全如何控制 遇到了那些比较棘…

C#轻松实现ModbusTCP服务器接口

大家好!我是付工。 通透!终于把ModbusRTU弄明白了 这样看来,ModbusTCP协议太简单了 太简单了!C#轻松实现Modbus通信 前面给大家介绍了一系列关于Modbus和ModbusTCP的知识,主要针对的是ModbusTCP客户端。 在实际开…

比较之舞,优雅演绎排序算法的智美篇章

大家好,这里是小编的博客频道 小编的博客:就爱学编程 很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!! 本文目录 引言正文一、冒泡排序:数据海…

mysql-5.7.18保姆级详细安装教程

本文主要讲解如何安装mysql-5.7.18数据库: 将绿色版安装包mysql-5.7.18-winx64解压后目录中内容如下图,该例是安装在D盘根目录。 在mysql安装目录中新建my.ini文件,文件内容及各配置项内容如下图,需要先将配置项【skip-grant-tab…

2025年华数杯国际赛B题论文首发+代码开源 数据分享+代码运行教学

176项指标数据库 任意组合 千种组合方式 14页纯图 无水印可视化 63页无附录正文 3万字 1、为了方便大家阅读,全文使用中文进行描述,最终版本需自行翻译为英文。 2、文中图形、结论文字描述均为ai写作,可自行将自己的结果发给ai&#xff0c…