单链表--续(C语言详细版)

2.6 在指定位置之前插入数据

// 在指定位置之前插入数据
void SLTInsert(SLTNode** pphead, SLTNode* pos, SLTDataType x);

分为两种情况:1. 插入的数据在链表中间;2. 插入的数据在链表的前面。

// 在指定位置之前插入数据
void SLTInsert(SLTNode** pphead, SLTNode* pos, SLTDataType x)
{
	// 链表不能为空 *pphead != NULL
	assert(pphead && *pphead);
	assert(pos);

	// 申请新的节点
	SLTNode* newNode = SLTBuyNode(x);

	// 若pos == *pphead,说明是头插,调用头插函数接口
	if (pos == *pphead)
	{
		SLTPushFront(pphead, x);
	}
	else
	{
		SLTNode* prev = *pphead;
		while (prev->next != pos)
		{
			prev = prev->next;
		}
		newNode->next = pos;
		prev->next = newNode;
	}
}

测试程序:测试头节点之前插入

void SListTest02()
{
	SLTNode* plist = NULL;
	// 测试尾插
	SLTPushBack(&plist, 1);
	SLTPushBack(&plist, 2);
	SLTPushBack(&plist, 3);
	SLTPushBack(&plist, 4);
	SLTPrint(plist);

	// 测试在指定位置之前插入数据
	// 先找下标,再插入
	//SLTNode* find = SLTFind(plist, 3);
	SLTNode* find = SLTFind(plist, 1);    // 测试头节点之前插入
	//SLTNode* find = SLTFind(plist, 4);
	SLTInsert(&plist, find, 16);
	SLTPrint(plist);
}

int main()
{
	SListTest02();

	return 0;
}

运行结果:

测试程序:测试链表中间插入

void SListTest02()
{
	SLTNode* plist = NULL;
	// 测试尾插
	SLTPushBack(&plist, 1);
	SLTPushBack(&plist, 2);
	SLTPushBack(&plist, 3);
	SLTPushBack(&plist, 4);
	SLTPrint(plist);

	// 测试在指定位置之前插入数据
	// 先找下标,再插入
	SLTNode* find = SLTFind(plist, 3);    // 测试头节点之前插入
	//SLTNode* find = SLTFind(plist, 1);
	//SLTNode* find = SLTFind(plist, 4);
	SLTInsert(&plist, find, 16);
	SLTPrint(plist);
}

int main()
{
	SListTest02();

	return 0;
}

运行结果:

2.7 在指定位置之后插入数据

// 在指定位置之后插入数据
void SLTInsertAfter(SLTNode* pos, SLTDataType x);

// 在指定位置之后插入数据
void SLTInsertAfter(SLTNode* pos, SLTDataType x) // 不需要给头节点
{
	assert(pos);

	// 申请新的节点
	SLTNode* newNode = SLTBuyNode(x);

	newNode->next = pos->next;
	pos->next = newNode;
}

测试程序:

void SListTest02()
{
	SLTNode* plist = NULL;
	// 测试尾插
	SLTPushBack(&plist, 1);
	SLTPushBack(&plist, 2);
	SLTPushBack(&plist, 3);
	SLTPushBack(&plist, 4);
	SLTPrint(plist);

	// 测试在指定位置之后插入数据
	SLTNode* find = SLTFind(plist, 1);
	SLTInsertAfter(find, 24);
	SLTPrint(plist);
}

int main()
{
	SListTest02();

	return 0;
}

运行结果:

2.8 删除pos节点

// 删除pos节点
void SLTErase(SLTNode** pphead, SLTNode* pos);

// 删除pos节点
void SLTErase(SLTNode** pphead, SLTNode* pos)
{
	// 链表不能为空 *pphead != NULL
	assert(pphead && *pphead);
	assert(pos);

	// pos是头节点
	if (pos == *pphead)
	{
		 这里就是头删接口函数
		//SLTNode* next = (*pphead)->next;
		//free(*pphead);
		//*pphead = next;

		SLTPopFront(pphead);
	}
	else
	{
		// pos不是头节点
		SLTNode* prev = *pphead;
		while (prev->next != pos)
		{
			prev = prev->next;
		}
		prev->next = pos->next;
		free(pos);
		pos = NULL;
	}
}

测试程序:

void SListTest02()
{
	SLTNode* plist = NULL;
	// 测试尾插
	SLTPushBack(&plist, 1);
	SLTPushBack(&plist, 2);
	SLTPushBack(&plist, 3);
	SLTPushBack(&plist, 4);
	SLTPrint(plist);

	// 测试删除pos节点
	//SLTNode* find = SLTFind(plist, 1);
	//SLTNode* find = SLTFind(plist, 4);
	SLTNode* find = SLTFind(plist, 3);
	SLTErase(&plist, find);
	SLTPrint(plist);
}

int main()
{
	SListTest02();

	return 0;
}

运行结果:

2.9 删除pos之后的节点

// 删除pos之后的节点
void SLTEraseAfter(SLTNode* pos);

// 删除pos之后的节点
void SLTEraseAfter(SLTNode* pos)
{
	assert(pos && pos->next);
	
	// 先存要删除的节点地址
	SLTNode* del = pos->next;
	pos->next = pos->next->next;
	//pos->next = del->next;
	free(del);
	del = NULL;
}

测试程序:测试中间的节点

void SListTest02()
{
	SLTNode* plist = NULL;
	// 测试尾插
	SLTPushBack(&plist, 1);
	SLTPushBack(&plist, 2);
	SLTPushBack(&plist, 3);
	SLTPushBack(&plist, 4);
	SLTPrint(plist);

    // 测试删除pos之后的节点
	//SLTNode* find = SLTFind(plist, 3);
	SLTNode* find = SLTFind(plist, 1);    // 中间的节点
	SLTEraseAfter(find);
	SLTPrint(plist);
}

int main()
{
	SListTest02();

	return 0;
}

运行结果:

测试程序:测试删除的是最后一个节点

void SListTest02()
{
	SLTNode* plist = NULL;
	// 测试尾插
	SLTPushBack(&plist, 1);
	SLTPushBack(&plist, 2);
	SLTPushBack(&plist, 3);
	SLTPushBack(&plist, 4);
	SLTPrint(plist);

    // 测试删除pos之后的节点
	SLTNode* find = SLTFind(plist, 3);    // 删除的是最后一个节点
	//SLTNode* find = SLTFind(plist, 1);
	SLTEraseAfter(find);
	SLTPrint(plist);
}

int main()
{
	SListTest02();

	return 0;
}

运行结果:

2.10 销毁链表

// 销毁链表
void SListDestroy(SLTNode** pphead);

// 销毁链表
void SListDestroy(SLTNode** pphead)
{
	assert(pphead && *pphead);

	SLTNode* pcur = *pphead;
	while (pcur)
	{
		SLTNode* next = pcur->next;
		free(pcur);
		pcur = next;
	}
	*pphead = NULL;
}

测试程序:

void SListTest02()
{
	SLTNode* plist = NULL;
	// 测试尾插
	SLTPushBack(&plist, 1);
	SLTPushBack(&plist, 2);
	SLTPushBack(&plist, 3);
	SLTPushBack(&plist, 4);
	SLTPrint(plist);

    // 测试删除pos之后的节点
	SLTNode* find = SLTFind(plist, 3);    // 删除的是最后一个节点
	//SLTNode* find = SLTFind(plist, 1);
	SLTEraseAfter(find);
	SLTPrint(plist);

    // 销毁链表
	SListDestroy(&plist);
	SLTPrint(plist);
}

int main()
{
	SListTest02();

	return 0;
}

调试结果:节点全部释放

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

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

相关文章

TISAX认证是什么?

TISAX认证是一种针对汽车行业数据安全和隐私保护的评估认证,其全称在不同资料中有所差异,但普遍认可的是它作为汽车行业信息安全评估体系的重要性。以下是对TISAX认证的详细解读: 一、背景和目的 随着汽车技术的不断发展,汽车数…

MySQL—统计函数和数学函数以及GROUP BY配合HAVING

合计/统计函数 count -- 演示 mysql 的统计函数的使用 -- 统计一个班级共有多少学生? SELECT COUNT(*) FROM student -- 统计数学成绩大于 90 的学生有多少个? SELECT COUNT(*) FROM student WHERE math > 90 -- 统计总分大于 250 的人数有多少&…

git-工作场景

1. 远程分支为准 强制切换到远程分支并忽略本地未提交的修改 git fetch origin # 获取最新的远程分支信息 git reset --hard origin/feature_server_env_debug_20240604 # 强制切换到远程分支,并忽略本地修改 2. 切换分支 1. **查看所有分支:**…

NewStarCTF2023-Misc

目录 week1 CyberChefs Secret 机密图片 流量!鲨鱼! 压缩包们 空白格 隐秘的眼睛 week2 新建Word文档 永不消逝的电波 1-序章 base! WebShell的利用 Jvav week3 阳光开朗大男孩 大怨种 2-分析 键盘侠 滴滴滴 week4 通大残 Nmap 依…

buuctf被嗅探的流量

下载出来是一个流量分析题 因为题目说了是联网状态下 嗅探到 所以一定有http协议 这里设置过滤器 一个一个去找吧 目前感觉wireshark的题都是http,太难的也不会

最后纪元Last Epoch可以通过什么搬砖 游戏搬砖教程

来喽来喽,最后纪元,一款《最后纪元》是一款以获得战利品为基础的暗黑风格动作RPG游戏,玩家将从2281年的毁灭时代追溯到由女神Eterra创造的世界,通过多个时代与黑暗的命运对抗,找到拯救世界的方式。游戏有五种职业&…

二叉平衡树(左单旋,右单旋,左右双旋、右左双旋)

一、AVL树(二叉平衡树:高度平衡的二叉搜索树) 0、二叉平衡树 左右子树高度差不超过1的二叉搜索树。 public class AVLTree{static class AVLTreeNode {public TreeNode left null; // 节点的左孩子public TreeNode right null; // 节点的…

【Unity2D 2022:NPC】制作NPC

一、创建NPC角色 1. 创建JambiNPC并同时创建Jambi站立动画 (1)点击第一张图片,按住shift不松,再选中后两张图片,拖到层级面板中 (2)将动画资源文件保存到Animation Clips文件夹中 (…

三维引擎实践 - OSG渲染线程创建过程(未完待续)

一:概述 一个3D应用程序,在创建好图形窗口之后,就要使用该窗口的OpenGL上下文进行渲染相关工作了,本节分析下OSG源码中渲染线程的建立过程。 二:OSG渲染线程用到了哪些类? 1. GraphicsThread 类&#xff0c…

政安晨:【Keras机器学习示例演绎】(五十二)—— 使用门控残差和变量选择网络进行分类

目录 简介 数据集 安装准备 数据准备 定义数据集元数据 创建用于训练和评估的 tf.data.Dataset 创建模型输入 对输入特征进行编码 实施门控线性单元 实施门控余留网络 实施变量选择网络 创建门控残差和变量选择网络模型 编译、训练和评估模型 政安晨的个人主页&am…

怎么判断自己是否适合学习PMP?

判断自己是否适合学习PMP项目管理专业人士认证,可以从以下几个方面进行考量: 1、职业发展需求: 如果您在项目管理领域工作,或计划未来从事相关工作,PMP认证能显著提升您的竞争力。 对于项目经理、产品经理、技术领导…

什么是边缘计算?创造一个更快、更智慧、更互联的世界

前言 如今,数十亿物联网传感器广泛部署在零售商店、城市街道、仓库和医院等各种场所,正在生成大量数据。从这些数据中更快地获得洞察,意味着可以改善服务、简化运营,甚至挽救生命。但要做到这一点,企业需要实时做出决策…

【ESP32】打造全网最强esp-idf基础教程——16.SmartConfig一键配网

SmartConfig一键配网 一、SmartConfig知识扫盲 在讲STA课程的时候,我们用的是代码里面固定的SSID和密码去连接热点,但实际应用中不可能这么弄,我们得有办法把家里的WiFi SSID和密码输入到设备里面去,对于带屏带输入设备还…

15.x86游戏实战-汇编指令jmp call ret

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 本次游戏没法给 内容参考于:微尘网络安全 工具下载: 链接:https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd6tw3 提…

【服务器】在Linux查看运行的Python程序,并找到特定的Python程序

在Linux查看运行的Python程序并找到特定的Python程序 写在最前面1. 使用ps命令查看所有Python进程查看详细信息 2. 使用pgrep命令查找Python进程ID 3. 使用top或htop命令使用top命令使用htop命令 4. 使用lsof命令查找Python进程打开的文件 5. 使用nvidia-smi命令查看GPU使用情况…

Cancer Cell | 卞修武院士/时雨/平轶芳团队揭示胶质瘤巨噬细胞研究全新视角

胶质母细胞瘤(glioblastoma,GBM)作为最常见的恶性脑肿瘤之一,其肿瘤微环境高度复杂且侵袭性极强。肿瘤相关巨噬细胞(TAMs)在胶质瘤发展和免疫抑制中扮演着关键角色,尽管靶向TAMs的治疗策略已经取…

68.SAP FICO - 记账码学习

目录 定义 用途 配置步骤 定义记账码 - OB41 配置会计科目类型 在会计中,“借”和“贷”是记账符号,代表了记账的方向。而在SAP中却没有大家熟知的记账符号“借”和“贷”,那SAP中如何录入凭证呢?其实,SA…

MT3054 搭积木

1.思路&#xff1a; 把二维矩阵转化成一维编号&#xff0c;之后将编号使用并查集&#xff0c;看最后是否在同一个集合中即可。 2.代码&#xff1a; #include <bits/stdc.h> using namespace std; const int N 1e3 10; int n, m, cnt, root; int fa[N * N]; int dx[…

09.C2W4.Word Embeddings with Neural Networks

往期文章请点这里 目录 OverviewBasic Word RepresentationsIntegersOne-hot vectors Word EmbeddingsMeaning as vectorsWord embedding vectors Word embedding processWord Embedding MethodsBasic word embedding methodsAdvanced word embedding methods Continuous Bag-…

网络编程:各协议头(数据报格式)

一、mac头 二、ip头 protocol——tcp/udp &#xff08;7&#xff09;TTL——生存时间 三、tcp头 四、udp头