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

ops/2025/1/19 6:46:40/

文章目录

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

欢迎大家来到我的博客,给生活来点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.ppmy.cn/ops/151304.html

相关文章

第十二章:算法与程序设计

文章目录: 一:基本概念 1.算法与程序 1.1 算法 1.2 程序 2.编译预处理 3.面向对象技术 4.程序设计方法 5.SOP标志作业流程 6.工具 6.1 自然语言 6.2 流程图 6.3 N/S图 6.4 伪代码 6.5 计算机语言 二:程序设计 基础 1.常数 …

Jmeter数据库

jmeter之操作数据库 一、下载jdbc 驱动,安装jdbc驱动 2、将驱动存放在4个路径下 (1)C:\Program Files\Java\jre1.8.0_60\lib (2)第二个存放的包 C:\Program Files\Java\jre1.8.0_60\lib\ext (3&#xf…

Inception 网络:开启多尺度卷积的图像识别新时代

Inception 网络:开启多尺度卷积的图像识别新时代 引言 随着人工智能技术的飞速发展,计算机视觉领域取得了显著的进步。作为计算机视觉的核心任务之一,图像识别和分类技术也在不断提升。在这一背景下,Inception网络作为一种深度卷…

回顾2024年在CSDN的成长

文章目录 我与CSDN的初次邂逅初学阶段的阅读CSDN:编程新手的避风港初学者的福音:细致入微的知识讲解考试复习神器:技术总结的“救命指南”曾经的自己:为何迟迟不迈出写博客的第一步兴趣萌芽:从“读”到“想写”的初体验…

数据可视化如何推动文旅行业的创新与发展

文旅行业作为25年国家重点政策照顾的行业,各家公司都在倾力打造相关的数字化产品。但是文旅行业相比较数据分析来说,目前困扰行业的难点在于面对海量数据信息如何将这些转化成有益信息是文旅行业面临的重要课题。因此,数据可视化逐渐收到了文…

计算机网络 (44)电子邮件

一、概述 电子邮件(Electronic Mail,简称E-mail)是因特网上最早流行的应用之一,并且至今仍然是因特网上最重要、最实用的应用之一。它利用计算机技术和互联网,实现了信息的快速、便捷传递。与传统的邮政系统相比&#…

idea创建SpringBoot自动创建Lombok无效果(解决)

问题:可以正常引用,而且也有提示,但是就是没有效果出来 首先按照网上的教程设置了这个地方发现还是没用,而且之前手动引入依赖都不用的,但是设置总之没错 最后发现:是POM.xml自动生成的配置文件的时候&…

Elasticsearch的function_score与rescore的区别

文章目录 前言一、function_score二、rescore三、区别对比总结 前言 在 Elasticsearch 中,function_score 和 rescore 都是对查询结果进行评分调整的机制,但它们的用途、作用范围和执行阶段有所不同。 一、function_score rescore 是一个用于 查询后重…