双向链表专题

⽬录
1. 双向链表的结构
2. 实现双向链表
3. 顺序表和双向链表的分析
正⽂开始

1. 双向链表的结构

注意:这⾥的“带头”跟前⾯我们说的“头节点”是两个概念,实际前⾯的在单链表阶段称呼不严
谨,但是为了同学们更好的理解就直接称为单链表的头节点。
带头链表⾥的头节点,实际为“哨兵位”,哨兵位节点不存储任何有效元素,它其实就是编译器生成的随机值然后存这前驱节点和后继节点,只是站在这⾥“放哨
的”
“哨兵位”存在的意义:
遍历循环链表避免死循环。

2. 双向链表的实现

2.1完整代码

 typedef int LTDataType;typedef struct ListNode{struct ListNode* next; //指针保存下⼀个节点的地址struct ListNode* prev; //指针保存前⼀个节点的地址LTDataType data;}LTNode;//void LTInit(LTNode** pphead);
LTNode* LTInit();
void LTDestroy(LTNode* phead);
void LTPrint(LTNode* phead);
bool LTEmpty(LTNode* phead);
void LTPushBack(LTNode* phead, LTDataType x);
void LTPopBack(LTNode* phead);
void LTPushFront(LTNode* phead, LTDataType x);
void LTPopFront(LTNode* phead);
//在pos位置之后插⼊数据
void LTInsert(LTNode* pos, LTDataType x);
void LTErase(LTNode* pos);
LTNode *LTFind(LTNode* phead,LTDataType x);

2.2具体实现 

老样子先创建三个文件

 在头文件这里定义我们双向循环链表的结构        

2.2.1双向链表结构体

2.2.2LTInit实现

 这里我们传入的是二级指针因为我们原本传入的就是指针,我们需要对头指针进行修改所以这里的形参属于二级指针

 这里初始化需要用到malloc,这里再我们写的头文件里面加上这三个需要用到的头文件

 这里可以看到next和prev都已经指向了自己

 这种方法也是可以的

 我们现在有了一个这样的双向链表那么我们就可以插入数据了接下来就是头插入和尾插了

2.2.3LTPushBack实现

思考:下面的参数哪一个是正确的

 正确答案是第二个

为什么?为什么? 为什么?为什么?为什么? 为什么?

这里可能会有疑问为什么写单项链表的时候传入的是二级指针呢

概念:双向循环链表只存在一个哨兵位(头节点)那么我们叫这个链表为空链表,上文我们说过我们传入二级指针只不过是为了改变指针的数值,但这里的头节点我们在初始化的时候就已经设置好的数值且后期不在需要更改,我们只需要修改头节点(哨兵位)的prev和next就行所以这里只需要传入指针就可。二级指针的作用就是为了改变实参的值而已

尾插需要值插入到尾部需要创建新的节点这里把创建节点封装成一个函数

2.2.3.1LTBuyNode

LTPusBack

 2.2.4LTPrint实现

 2.2.5LTPushFront实现

2.2.6LTPopBack的实现


2.2.7LTPopFront的实现


 2.2.8 LTFind的实现

2.2.9LTInsert的实现

 

2.2.9LTDel的实现

 

2.2.9LTDesTroy的实现

 

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

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

相关文章

软考114-上午题-【计算机网络】-路由

一、路由 二、真题 真题1: 真题2: 真题3: 真题4: 真题5: 路由协议实际上是一种在路由器之间交换路由信息的协议。 路由协议让路由器了解整个网络的拓扑结构,包括哪些网络是直接相连的,哪些网络…

CSS设置字体样式

目录 前言: 1.font-family: 2.font-style: 3.font-weight: 4.font-size: 5.font-variant: 6.font: 前言: 在网页中字体是重要的组成部分,使用好字体可以让网页更…

【Linux】UDP编程【上】{诸多编程接口/小白入门式讲解}

文章目录 0.预备知识0.1套接字0.2TCP/UDP0.3大小端问题 1.socket 常见API1.1socket1.2各个接口1.3int bind();1.3网络头文件四件套1.4bzero1.5recvfrom1.6sendto() 2.UDP编程2.1服务器编程2.2客户端编程2.3运行测试2.3.1本机通信2.3.2popen2.3.3strcasestr2.3.4回顾C11智能指针…

AJAX 原理

一、AJAX原理 - XMLHttpRequest 定义: 关系:axios 内部采用 XMLHttpRequest 与服务器交互。 好处:掌握使用 XHR 与服务器进行数据交互,了解 axios 内部原理。 1.1 使用 XMLHttpRequest: 步骤: 1. 创建 XM…

网络安全 | 什么是双因子认证2FA?

关注WX: CodingTechWork 介绍 概念 双因子认证 (2FA),顾名思义,2个因子进行认证。2FA是一种身份验证方法,要求用户提供密码和另一个认证因子或者至少提供两个认证因子(代替密码),才能访问网站…

机器学习(理论第一课)

一、理解人工智能、机器学习、深度学习、强化学习? 人工智能、机器学习和深度学习之间存在递进关系,它们的覆盖范围逐层递减。 **人工智能(Artificial Intelligence,AI)**是最宽泛的概念,旨在研究、开发用于…

关于 VScode, 点击文件右键或者在文件夹中没有 【 在vscode中打开选项】 解决办法

关于 VScode, 点击文件右键或者在文件夹中没有 【 在vscode中打开选项】 解决办法 段子手-168 2024-4-6 1、在任意位置创建一个文本文件。如:a.txt 2、复制以下代码到 a.txt 文本文件中。 (注: 以 ; 开头的 , 是备注信息 , 不需要做任何修…

计算机网络 实验指导 实验12

路由信息协议(RIP)实验 1.实验拓扑图 名称接口IP地址网关Switch AF0/1192.168.1.1/24F0/2172.1.1.1/24Switch BF0/1192.168.1.2/24F0/2172.2.2.1/24PC1172.1.1.2/24172.1.1.1PC2172.1.1.3/24172.1.1.1PC3172.2.2.2/24172.2.2.1PC4172.2.2.3/24172.2.2.1…

Rust 基础语法和数据类型

数据类型 Rust提供了一系列的基本数据类型,包括整型(如i32、u32)、浮点型(如f32、f64)、布尔类型(bool)和字符类型(char)。此外,Rust还提供了原生数组、元组…

Redis中的Sentinel(四)

Sentinel 接收来自主服务器和从服务器的频道消息。 当Sentinel与一个主服务器或者从服务器建立起订阅连接之后,Sentinel就会通过订阅连接,向服务器发送以下命令: SUBSCRIBE _sentinel_:helloSentinel对_sentinel_:hello频道的订阅会一直持续到Sentine…

linux之文件系统、inode和动静态库制作和发布

一、背景 1.没有被打开的文件都在磁盘上 --- 磁盘级文件 2.对磁盘级别的文件,我们的侧重点 单个文件角度 -- 这个文件在哪里,有多大,其他属性是什么? 站在系统角度 -- 一共有多少文件?各自属性在哪里&#xff1f…

linux 安装 pptp 协议

注意:目前iOS已不支持该协议 yum -y install ppp wget https://download-ib01.fedoraproject.org/pub/epel/7/x86_64/Packages/p/pptpd-1.4.0-2.el7.x86_64.rpm yum -y install pptpd-1.4.0-2.el7.x86_64.rpm vi /etc/pptpd.conf 去除 localip 和 remoteip的注释 …