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

文章目录

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

欢迎大家来到我的博客,给生活来点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.mzph.cn/news/892852.shtml

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

相关文章

41,【7】CTFHUB WEB SQL Cookie注入

搜索知Cookie 是由服务器发送给用户浏览器的一小段文本信息,浏览器会将其保存下来,并且在后续的请求中自动将 Cookie 发送回服务器。 所以可以联想到cookie会出现在请求处,可以使用BP抓包 找到了 又是整形注入 可知字节数为2 找到回显点 得…

unity学习16:unity里向量的计算,一些方法等

目录 1 unity里的向量: 2 向量加法 2.1 向量加法的几何意义 2.2向量加法的标量算法 3 向量减法 3.1 向量减法的几何意义 3.2 向量减法的标量算法 4 向量的标量乘法 5 向量之间的乘法要注意是左乘 还是右乘 5.1 注意区别 5.2 向量,矩阵&#x…

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

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

堆的实现【C++】

堆的实现 概念实现完整代码 概念 介绍堆之前得说一下二叉树,因为堆的逻辑结构是二叉树,二叉树的树的子集,树只有一个根节点,向下衍生出了很多节点,并且这个节点之间相互没有连接,除非是父子节点&#xff0…

UI自动化测试:异常截图和page_source

自动化测试过程中,是否遇到过脚本执行中途出错却不知道原因的情况?测试人员面临的不仅是问题的复现,还有对错误的快速定位和分析。而异常截图与页面源码(Page Source)的结合,正是解决这一难题的利器。 在实…

语法

jQuery 的 .toggleClass() 方法用于在选定的元素上添加或移除一个或多个类。这个方法会检查每个元素中指定的类,如果类不存在,则添加它;如果类已设置,则删除它。这被称为切换效果。此外,可以通过使用 "switch" 参数来规定只删除或只添加类。 语法 (selector).…

Node.js 版本管理工具完全指南

Node.js 版本管理工具完全指南 目录 1. nvm (Node Version Manager)2. n (Node Package Manager)3. fnm (Fast Node Manager)4. Volta5. 工具对比 1. nvm (Node Version Manager) 1.1 安装指南 macOS/Linux # 使用 curl 安装 curl -o- https://raw.githubusercontent.com…

线程池底部工作原理

线程池内部是通过线程和队列实现的,当我们通过线程池处理任务时: 如果线程池中的线程数量小于corePoolSize,无论是否有处于空闲的线程,都创建新的线程来处理被添加的任务。 如果线程池中的线程数量等于corePoolSize,…

ASP.NET Core - 依赖注入(三)

ASP.NET Core - 依赖注入(三) 4. 容器中的服务创建与释放 4. 容器中的服务创建与释放 我们使用了 IoC 容器之后,服务实例的创建和销毁的工作就交给了容器去处理,前面也讲到了服务的生命周期,那三种生命周期中对象的创…

【C++】面试题整理(未完待续)

【C】面试题整理 文章目录 一、概述二、C基础2.1 - 指针在 32 位和 64 位系统中的长度2.2 - 数组和指针2.3 - 结构体对齐补齐2.4 - 头文件包含2.5 - 堆和栈的区别2.6 - 宏函数比较两个数值的大小2.7 - 冒泡排序2.8 - 菱形继承的内存布局 三、智能指针3.1 - 智能指针是线程安全的…

gitlab runner正常连接 提示 作业挂起中,等待进入队列 解决办法

方案1 作业挂起中,等待进入队列 重启gitlab-runner gitlab-runner stop gitlab-runner start gitlab-runner run方案2 启动 gitlab-runner 服务 gitlab-runner start成功启动如下 [rootdocserver home]# gitlab-runner start Runtime platform …

麦田物语学习笔记:构建游戏的时间系统

基本流程 1.代码思路 (1)新建一个TimeManager.cs (2)创建枚举变量来表示四季,在TimeManager里需要的变量有: 游戏内的秒,分钟,小时,天,月,年;游戏内的季节;控制一个季节有多少个月;控制时间的暂停;计时器tikTime (3)在Settings里添加计时器的阈值,以及各个时间的进位 (4)初始化…

Spring Boot教程之五十七:在 Apache Kafka 上发布 JSON 消息

Spring Boot | 如何在 Apache Kafka 上发布 JSON 消息 Apache Kafka是一个发布-订阅消息系统。消息队列允许您在进程、应用程序和服务器之间发送消息。在本文中,我们将了解如何在 Spring Boot 应用程序中向 Apache Kafka 发送 JSON 消息。 为了了解如何创建 Spring…

c++类和对象---下

文章目录 一、类的静态成员 1.1.静态成员变量:所有对象共享的成员变量。 1.2.静态成员函数:可以访问静态成员变量,但不能访问非静态成员变量。 二、类的继承 2.1.继承:子类继承父类的成员变量和成员函数。 2.2.多态:基…

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

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

代码随想录算法训练营day02| 977.有序数组的平方、209.长度最小的子数组、59.螺旋矩阵II

977. 有序数组的平方 双指针&#xff0c;新数组用k&#xff1b; 由于已经排序&#xff0c;所以比较两侧数据即可&#xff1b; class Solution { public:vector<int> sortedSquares(vector<int>& nums) {vector<int> ans(nums.size());int k nums.siz…

Unity 语音转文字 Vosk 离线库

市场有很多语音库&#xff0c;这里介绍Vosk SDK 除了支持untiy外还有原生开发服务器等 目录 安装unity示例demo下载语音训练文件运行demo结尾一键三联 注意事项 有可能debug出来的文本是空的&#xff0c;&#xff08;确保麦克风正常&#xff0c;且索引正确&#xff09;分大…

网络网络层ICMP协议

网络网络层ICMP协议 1. ICMP 协议介绍 ICMP&#xff08;Internet Control Message Protocol&#xff09;是 TCP/IP 协议簇中的网络层控制报文协议。用于在 IP 主机、路由器之间传递控制消息&#xff0c;提供可能有关通信问题的反馈信息。 以及用于网络诊断或调试&#xff08;…

Lianwei 安全周报|2025.1.13

新的一周又开始了&#xff0c;以下是本周「Lianwei周报」&#xff0c;我们总结推荐了本周的政策/标准/指南最新动态、热点资讯和安全事件&#xff0c;保证大家不错过本周的每一个重点&#xff01; 政策/标准/指南最新动态 01 美国国土安全部发布《公共部门生成式人工智能部署手…

计算机网络(五)运输层

5.1、运输层概述 概念 进程之间的通信 从通信和信息处理的角度看&#xff0c;运输层向它上面的应用层提供通信服务&#xff0c;它属于面向通信部分的最高层&#xff0c;同时也是用户功能中的最低层。 当网络的边缘部分中的两个主机使用网络的核心部分的功能进行端到端的通信时…