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

文章目录

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

欢迎大家来到我的博客,给生活来点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:节点与数组不同的点:数组是连续的地址,结点的地址是不连续的

顺序表和链表的分析

在这里插入图片描述

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

结语

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

持续集成 01|Gitee介绍、Pycharm使用Gitee

目录 一、理论 二、 git的简介与安装 三、Gitee 1、注册网易163邮箱 2、注册Gitee账号 3、git和gitee管理代码工作原理 三、PyCharm安装配置Gitee 四、Pycharm使用Gitee插件的五种场景 1、将 Gitee的新仓库 Checkout(检出)到 Pycharm中 2、推送…

金融项目实战 05|Python实现接口自动化——登录接口

目录 一、代码实现自动化理论及流程 二、脚本实现的理论和准备工作 1、抽取功能转为自动化用例 2、搭建环境(测试工具) 3、搭建目录结构 三、登录接口脚本实现 1、代码编写 1️⃣api目录 2️⃣script目录 2、断言 3、参数化 1️⃣编写数据存储文件:jso…

【git】-3 github创建远程仓库,上传自己的项目,下载别人的项目

一、如何使用Github 1、创建远程仓库 2、使用github拉取/推送代码 克隆仓库 向远程仓库推送代码-git push 二、上传我们自己的项目到github 方法一:直接上传 方法二:使用git命令 方法三: 将仓库拉取到本地上传 三、下载别人的项目 …

Java算法 数据结构基础 并查集 模版 [洛谷-P3367]

目录 题目地址 题目描述 输入输出样例 并查集模版 介绍 1. 路径压缩(Path Compression) 2. 按秩合并(Union by Rank / Size) 代码讲解 操作讲解 时间复杂度分析 应用场景 题目地址 【模板】并查集 - 洛谷 题目描述 输…

PyCharm文档管理

背景:使用PyCharmgit做文档管理 需求:需要PyCharm自动识别docx/xslx/vsdx等文件类型,并在PyCharm内点击文档时唤起系统内关联应用(如word、excel、visio) 设置步骤: 1、file -》 settings -》file types 2、在Files opened i…

卷积神经05-GAN对抗神经网络

卷积神经05-GAN对抗神经网络 使用Python3.9CUDA11.8Pytorch实现一个CNN优化版的对抗神经网络 简单的GAN图片生成 CNN优化后的图片生成 优化模型代码对比 0-核心逻辑脉络 1)Anacanda使用CUDAPytorch2)使用本地MNIST进行手写图片训练3)…

基于springboot的租房网站系统

作者:学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等 文末获取“源码数据库万字文档PPT”,支持远程部署调试、运行安装。 项目包含: 完整源码数据库功能演示视频万字文档PPT 项目编码&#xff1…

创建 WordPress 插件(第一部分):添加管理页面

WordPress 是互联网上最受欢迎的内容管理系统之一。它是用 PHP 创建的,可以处理从博客到商业网站的一切需求。事实上,我们的博客和网站都使用 WordPress。在本文中,我将向你展示如何创建一个 WordPress 插件,该插件会在管理员控制…

「港科技」联手「地平线」打造GPT风格的自动驾驶世界模型:DrivingWorld

摘要 最近在自回归(AR)生成模型方面的成功,例如自然语言处理中的GPT系列,激发了在视觉任务中复制这一成功的努力。一些研究尝试将这种方法扩展到自动驾驶中,通过构建基于视频的世界模型来生成逼真的未来视频序列和预测…

FPGA工程师成长四阶段

朋友,你有入行三年、五年、十年的职业规划吗?你知道你所做的岗位未来该如何成长吗? FPGA行业的发展近几年是蓬勃发展,有越来越多的人才想要或已经踏进了FPGA行业的大门。很多同学在入行FPGA之前,都会抱着满腹对职业发…

SOME/IP协议详解 基础解读 涵盖SOME/IP协议解析 SOME/IP通讯机制 协议特点 错误处理机制

车载以太网协议栈总共可划分为五层,分别为物理层,数据链路层,网络层,传输层,应用层,其中今天所要介绍的内容SOME/IP就是一种应用层协议。 SOME/IP协议内容按照AUTOSAR中的描述,我们可以更进一步…

为ARM64架构移植Ubuntu20.04换源的发现

在为ARM64架构(RK3566)移植ubuntu20.04的时候发现在更换为国内源之后,无法正常完成apt update,报错为: Ign:25 http://mirrors.aliyun.com/ubuntu focal-updates/main arm64 Packages …

Playwright vs Selenium:全面对比分析

在现代软件开发中,自动化测试工具在保证应用质量和加快开发周期方面发挥着至关重要的作用。Selenium 作为自动化测试领域的老牌工具,长期以来被广泛使用。而近年来,Playwright 作为新兴工具迅速崛起,吸引了众多开发者的关注。那么…

【全套】基于机器学习的印度森林火灾发生概率的分析与预测

【私信送源码文档】基于机器学习的印度森林火灾发生概率的分析与预测 对应的ppt 摘 要 随着全球气候变化的不断加剧,火灾的频发和规模逐渐增大,成为备受关注的问题。本文旨在提高对火灾发生概率的准确性,为火灾的预防和管理提供科学支持。在…

【Go】Go Gin框架初识(一)

1. 什么是Gin框架 Gin框架:是一个由 Golang 语言开发的 web 框架,能够极大提高开发 web 应用的效率! 1.1 什么是web框架 web框架体系图(前后端不分离)如下图所示: 从上图中我们可以发现一个Web框架最重要…

TCP/IP协议簇及封装与解封装

TCP/IP协议簇 现如今用的参考模型TCP/IP 是一个协议簇,它组建了整个互联网 最主要的是TCP/IP 和这两个协议,所以起名为TCP/IP TCP/IP模型 TCP/IP标准模型——四层 TCP/IP对等模型——五层 数据链路层分为两个子层: LLC子层:逻辑…

《基于卷积神经网络的星图弱小目标检测》论文精读

Dim small target detection based on convolutinal neural network in star image 摘要 由于低信噪比目标和复杂背景,星图中弱小目标的检测是一项具有挑战性的任务。本文提出了一种深度学习方法,用于在背景不均匀和不同类型的噪声下检测单帧星图中的弱…

如何选择Ubuntu版本

一、为什么要选择Ubuntu系统? CentOS官方已全面停止维护CentOS Linux项目 。具体来说,CentOS 8已于2021年12月31日停止维护,而CentOS 7则在2024年6月30日结束了生命周期 。这意味着这些版本不再接收官方的安全更新、bug修复或技术支持 二、…

计算机视觉算法实战——视频分析(Video Analysis)

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​​​​​​ ​​​​​​​​​​​​ ​​​​​ 视频分析是计算机视觉中的一个重要领域,旨在从视频数据中提取有用的信息&…

O2O同城系统架构与功能分析

2015工作至今,10年资深全栈工程师,CTO,擅长带团队、攻克各种技术难题、研发各类软件产品,我的代码态度:代码虐我千百遍,我待代码如初恋,我的工作态度:极致,责任&#xff…