详解双向链表

news2024/11/24 10:03:40

1.创建一个新的节点的函数

LTNode*BuyLTnode(LTDataType x)
{
	LTNode* newnode = (LTNode*)malloc(sizeof(LTNode));
	if (newnode == NULL)
	{
		perror("malloc");
		return NULL;
	}
	newnode->next = NULL;
	newnode->prev = NULL;
	newnode->data = x;
	return newnode;
}

2.哨兵位的两个next,都初始化为了,链接自己的节点的next

 

LTNode* LTInit()
{
	LTNode* phead = BuyLTnode(-1);//这个-1是给哨兵位的data的,把哨兵位data初始化成-1
	phead->next = phead;
	phead->prev = phead ;
	return phead;
}

 

3.尾插先从head->prev,找到最后的一个位置

void LTPushBack(LTNode* phead, LTDataType x)
{
	//LTInsert(phead, x);
	assert(phead);
	LTNode* tail = phead->prev;
	LTNode* newphead = BuyLTnode(x);
	tail->next = newphead;
	newphead->prev = tail;
	phead->prev = newphead;
	newphead->next = phead;

4.头插,first先记录head的下一个节点,防止插入时把head的下一个节点地址替换弄没了

 

void LTPushPront(LTNode* phead, LTDataType x)
{
	//LTInsert(phead->next, x);
	assert(phead);
	LTNode* newnode = BuyLTnode(x);
	LTNode* first = phead->next;//注意此步
	//空链表直接在哨兵位插入,为空的情况
	phead->next = newnode;
	newnode->prev = phead;

	//不为空的情况
	newnode->next = first;
	first->prev = newnode;
}

 

5.尾删,phead->prev;找到尾并记录下来并free掉最尾节点,而且还要把尾的前一个节点记录下来记录到new里,再让哨兵位和新的节点new建立新的连接

 

void LTPopBack(LTNode* phead)
{
	//LTErase(phead->prev);
	assert(phead);
	//没有数据只有哨兵位了,防止删了哨兵位
	assert(!LTEmpty(phead));//bool相同返回来的是真,但在assert括号中!ture,不等于真。bool相同返回为真则判断为假。
	LTNode* tail = phead->prev;
	LTNode* new = tail->prev;
	free(tail);
	new->next = phead;
	phead->prev = new;
}

6.头删把哨兵位后一个节点删掉,且哨兵位和第二节点建立新的连接

 

void LTPopPront(LTNode* phead)
{
	//LTErase(phead->next);
	assert(phead);
	assert(!LTEmpty(phead));
	LTNode* first = phead->next;
	LTNode* second = first->next;
	free(first);
	phead->next = second;
	second->prev = phead;
}

7.打印函数,从哨兵位的下一个节点开始打印

 

void LTPrint(LTNode* phead)
{
	assert(phead);
	LTNode* cur = phead->next;//注意此步
	printf("sentinel<==>");
	while (cur != phead)
	{
		printf("%d<==>", cur->data);
		cur = cur->next;
	}
	printf("\n");
}

8.寻找想查找的的值,pos->data == x就是要查找的节点

LTNode* LTFind(LTNode* pos, LTDataType x)//寻找想查找的的值
{
	assert(pos);
	LTNode* cur = pos->next;
	while (cur != pos)
	{
		if (cur->data == x)
		{
			return cur;
		}
		cur = cur->next;
	}
	return NULL;
}

9.在poss处之前插入,在寻找到处的前处插入,first先记录head的下一个节点,防止插入时把head的下一个节点地址替换弄没了,和头插原理相同

void LTInsert(LTNode* pos, LTDataType x)//在poss处之前插入,在寻找到处的前处插入
{
	assert(pos);
	LTNode* newnode = BuyLTnode(x);
	LTNode* first = pos->prev; 

	pos->prev = newnode;
	newnode->next = pos;

	first->next = newnode;
	newnode->prev = first;
}

 

10.删除poss处的节点

 

void LTErase(LTNode* pos)//删除poss处的节点
{
	assert(pos);
	LTNode* cur = pos;
	LTNode* tail = pos->next;
	LTNode* first = pos->prev;
	free(cur);
	tail->prev = first;
	first->next = tail;
}

11.删除所有的节点

 

void LTDestroy(LTNode* phead)
{
	LTNode* cur = phead->next;
	while (cur != phead)
	{
		LTNode* next = cur->next;//保存下一个节点
		free(cur);
		cur = next;//下一个节点更新到cur,循环走起来
	}
	free(phead);
}

 

12.布尔值:布尔值:return phead->next == phead;若不相等返回为假,相等返回真。

     12.2.assert(!LTEmpty(phead));assert不等于真。bool函数返回的值假在assert括号中就是真就不会触发assert, bool函数返回值真在assert括号中就是假就触发asser。
    12. 3.为在头删和尾删的函数使用为了防止哨兵位被删掉了
bool LTEmpty(LTNode* phead)
{
	assert(phead);
	return phead->next == phead;//相同返回的真:ture
}

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

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

相关文章

Java中创建线程三种方式

继承Thread类创建线程实现Runnable接口创建线程使用Callable和Future创建线程 继承Thread类 /*** 使用集成Thread的方式实现多线程*/ public class Match1 {public static void main(String[] args) {Runner liuxiang new Runner();//创建一个新的线程liuxiang.setName(&quo…

智慧餐饮系统jsp酒店点餐订餐管理java源代码

本项目为前几天收费帮学妹做的一个项目&#xff0c;Java EE JSP项目&#xff0c;在工作环境中基本使用不到&#xff0c;但是很多学校把这个当作编程入门的项目来做&#xff0c;故分享出本项目供初学者参考。 一、项目描述 智慧餐饮系统 系统有1权限&#xff1a;管理员 智慧餐…

2023国赛数学建模E题思路分析

文章目录 0 赛题思路1 竞赛信息2 竞赛时间3 建模常见问题类型3.1 分类问题3.2 优化问题3.3 预测问题3.4 评价问题 4 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 竞赛信息 全国大学生数学建模…

【电脑配置】新电脑买回来怎么配置?

【电脑配置】新电脑买回来怎么配置&#xff1f; 前记1. 系统激活步骤记录1.1 前期流程1.2 问题&#xff1a;PIN设置的时候卡住1.3 非联网状态下的后续激活步骤1.4 设置安全验证&#xff1a;PIN 2. 浏览器和联网3. office软件4. 数据迁移5. 编程环境搭建5.1 JDK1.8安装5.2 pytho…

Opencv4基于C++基础入门笔记:图像 颜色 事件响应 图形 视频 直方图

文章目录&#xff1a; 一&#xff1a;环境配置搭建 二&#xff1a;图像 1.图像读取与显示 main.cpp 运行结果 2.图像色彩空间转换 2.1 换色彩 test.h test.cpp main.cpp 运行结果 2.2 照片换背景 test.h test.cpp main.cpp 运行结果 …

网页制作神器—ElementUI(小白入门超详细)

目录 一、前置准备 ⚓ 二、引入ElementUI &#x1f4c4; 三、使用ElementUI ⚙️ 一、前置准备 ⚓ 1、安装相关环境&#xff0c;使用VsCode或者webstrom初始化Vue 项目 软件环境下载地址&#xff1a;软件 - 坚果云 - |同步|备份|无限空间 vue-cli安装&#xff1a; np…

Linux-C++开发项目:基于主从Reactor模式的高性能并发服务器

目录 1.项目介绍2.1项目部署2.2安装版本较高的编译器 2.项目开发过程2.1网络库模块开发2.1.1简单日志宏的实现2.1.2Buffer模块实现2.1.3Socket模块实现2.1.4Channel模块实现2.1.5Poller模块实现2.1.6TimerWheel模块实现2.1.7EventLoop模块实现2.1.8整合测试12.1.9LoopThread模块…

Python:23种Pandas核心操作方法

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 Pandas 是一个 Python 软件库&#xff0c;它提供了大量能使我们快速便捷地处理数据的函数和方法。 一般而言&#xff0c;Pandas 是使 Python 成为强大而高效的数据分析环境的重要因素之一。 在本文中&#xff0c;作者从基本…

LeetCode530. 二叉搜索树的最小绝对差

530. 二叉搜索树的最小绝对差 文章目录 [530. 二叉搜索树的最小绝对差](https://leetcode.cn/problems/minimum-absolute-difference-in-bst/)一、题目二、题解方法一&#xff1a;中序遍历递归方法二&#xff1a;迭代 一、题目 给你一个二叉搜索树的根节点 root &#xff0c;返…

一篇打通,pytest自动化测试框架详细,从0到1精通实战(一)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 pytest单元测试框…

js设置css变量控制页面一行展示指定个数的元素

前置知识&#xff1a; CSS变量之var()函数的应用——动态修改样式 & root的使用 flex相关知识 场景&#xff1a; 动态设置给父元素内子元素设置每行排列几个 通过 document.body.style.setProperty(--itemNum, 5)设置样式变量&#xff0c;然后通过给父元素设置display: f…

此芯科技加入 openKylin 开源社区

导读近日消息&#xff0c;据此芯科技官方公众号表示&#xff0c;此芯科技目前已经签署 openKylin 社区 CLA&#xff08;Contributor License Agreement 贡献者许可协议&#xff09;&#xff0c;正式加入 openKylin 开源社区。 此芯科技成立于 2021 年&#xff0c;是一家专注于设…

EDUSRC之一次奇葩的文件上传

当时误打误撞发现的&#xff0c;觉得挺奇葩的&#xff0c;记录下 一个正常的图片上传的点&#xff0c;文件类型白名单 但是比较巧的是当时刚对上面的id进行过注入测试&#xff0c;有一些遗留的测试 payload 没删&#xff0c;然后在测试上传的时候就发现.php的后缀可以上传了&a…

Https、CA证书、数字签名

Https Http协议 Http协议是目前应用比较多应用层协议&#xff0c;浏览器对于Http协议已经实现。Http协议基本的构成部分有 请求行 &#xff1a; 请求报文的第一行请求头 &#xff1a; 从第二行开始为请求头内容的开始部分。每一个请求头都是由K-V键值对组成。请求体&#xf…

Remote Sensing,2023 | 基于SBL的分布式毫米波相干雷达成像的高效实现

Remote Sensing,2023 | 基于SBL的分布式毫米波相干雷达成像的高效实现 注1&#xff1a;本文系“无线感知论文速递”系列之一&#xff0c;致力于简洁清晰完整地介绍、解读无线感知领域最新的顶会/顶刊论文(包括但不限于 Nature/Science及其子刊; MobiCom, Sigcom, MobiSys, NSDI…

Kubeadm安装K8s集群

一、硬件环境 准备3台Linux服务器&#xff0c;此处用Vmware虚拟机。 主机名CPU内存k8smaster2核4Gk8snode12核4Gk8snode22核4G 二、系统前置准备 配置三台主机的hosts文件 cat << EOF > /etc/hosts 192.168.240.130 k8smaster 192.168.240.132 k8snode1 192.168.…

小白必看:测试人有必要参考的软件测试工作规范

为了规范测试工作、减少开发与测试之前的沟通成本、保证项目进度、提高软件质量&#xff0c;测试人员有必要参考这份软件测试工作规范。 1.1. 编码规范 软件程序开发需要遵守编码规范&#xff0c;一是可以减少代码的维护成本&#xff0c;提高开发工作效率&#xff1b;二是有…

2023国赛数学建模思路 - 复盘:人力资源安排的最优化模型

文章目录 0 赛题思路1 描述2 问题概括3 建模过程3.1 边界说明3.2 符号约定3.3 分析3.4 模型建立3.5 模型求解 4 模型评价与推广5 实现代码 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 描述 …