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

news2024/9/20 6:34:02

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.coloradmin.cn/o/1917968.html

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

相关文章

Python实战演练——羊了个羊抓包通关教程及无限套娃通关次数!

1. 需求 最近热门的羊了个羊,听说通关率不到0.1% 第一关超级简单,第二关可就难倒了太多的小伙伴,往往是你以为快没了,结果还有好多层,有朋友分析过,地狱有十八层,而它有十九层。 博主也曾熬夜…

可视化传输机房设计方案

建筑可视化机房可视化(3D)机房可视化(2D)多机柜可视化单机柜可视化(3D)单机柜可视化(2D)设备与插槽可视化端口连线及链路可视化

栈和队列题目详解

前言: 在前面我们学习了栈和队列,栈的特性是后进先出,队列的特性是先进先出,当我们了解了这些之后,我们就可以用到栈和队列的特性来简单的做一些题目了。 1. 有效的括号 有效的括号:. - 力扣&#xff08…

ESP32驱动摄像头:1.驱动OV2640模块(待验证)

一、装ArduCam库和ESPAsyncWebServer库 二、参考代码 #include <Wire.h> #include <ArduCAM.h> #include <SPI.h> #include <WiFi.h> #include <ESPAsyncWebServer.h>#define CAM_CS 32 // modify according to your own wiring #define OV2640…

昇思25天训练营Day11 - 基于 MindSpore 实现 BERT 对话情绪识别

模型简介 BERT全称是来自变换器的双向编码器表征量&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;&#xff0c;它是Google于2018年末开发并发布的一种新型语言模型。与BERT模型相似的预训练语言模型例如问答、命名实体识别、自然语言推理、…

电焰灶:烹饪性能的深度剖析

在如今众多的厨房炉灶选择中&#xff0c;华火电焰灶以其独特的技术和性能吸引了不少消费者的目光。那么&#xff0c;华火电焰灶的综合烹饪性能究竟如何呢&#xff1f;让我们一起来深入探究。 首先&#xff0c;从火力方面来看&#xff0c;华火电焰灶展现出了强大的优势。其火焰强…

5G/4G加密边缘计算电力网关,开启智慧电力新篇章

计讯物联TG452&#xff0c;一款面向电力行业应用的工业级物联网网关&#xff0c;持电力协议及规约标准&#xff0c;支持采集、存储、算力、通信组网 、协议转换、控制等多功能。    电力应用   计讯物联电力网关TG452支持电力IEC101、IEC104、IEC61850、DL/T645等协议标准…

uniapp 微信小程序,最简单的流式输出:Transfer-Encoding: chunked

在GPT项目中&#xff0c;流式输出是实现流畅对话体验的关键技术之一。今天&#xff0c;我们将探讨如何在uniapp开发的微信小程序中优雅地实现这一功能。虽然WebSocket是一种常见的解决方案&#xff0c;但在某些场景下&#xff0c;我们可能寻求更轻量级且易于集成的替代方案。本…

unity使用 MQTT复现plant simulate仿真

unity使用 MQTT复现plant simulate仿真 一、plant simulate端配置 1、plant simulate MQTT组件配置&#xff0c;该组件在类库的信息流类目下&#xff0c;端口不变&#xff0c;填写ip即可&#xff1b; 2、设备配置界面&#xff0c;在控件入口和出口处各挂一个脚本&#xff0c;…

新手教学系列——MongoDB聚合查询的进阶用法

引言 MongoDB的聚合查询是其最强大的功能之一。无论是汇总、平均值、计数等标准操作,还是处理复杂的数据集合,MongoDB的聚合框架都能提供高效且灵活的解决方案。本文将通过几个实例,详细讲解如何在实际项目中使用MongoDB进行聚合查询。 标准应用:汇总、平均值、计数等 在…

认识string(一)详解

目录 标准库中的string类了解如何看文档Construct string (构造string)string()空字符串构造函数&#xff08;默认构造函数&#xff09;string (const string& str) 拷贝构造函数string (const string& str, size_t pos, size_t len npos)string (const char* s)复制构…

FiddlerScript Rules修改-更改发包中的cookie

直接在fiddler script editor中增加如下处理代码即可 推荐文档oSession -- 参数说明 测试笔记 看云

SSRF漏洞深入利用与防御方案绕过技巧

文章目录 前言SSRF基础利用1.1 http://内网资源访问1.2 file:///读取内网文件1.3 dict://探测内网端口 SSRF进阶利用2.1 Gopher协议Post请求2.2 Gopher协议文件上传2.3 GopherRedis->RCE2.4 JavaWeb中的适用性&#xff1f; SSRF防御绕过3.1 Url黑名单检测的绕过3.2 Url白名单…

公共安全和应急管理系统:提升社区韧性与危机应对能力

引言 公共安全和应急管理是现代社会不可或缺的组成部分&#xff0c;其核心目标是确保社会的稳定和居民的福祉。随着全球化、城市化和技术进步&#xff0c;社会面临的风险和威胁日益复杂多样&#xff0c;从自然灾害到人为事故&#xff0c;从公共卫生危机到恐怖袭击&#xff0c;公…

机器学习(V)--无监督学习(三)EM算法

EM算法 极大似然估计 极大似然估计&#xff1a;(maximum likelihood estimate, MLE) 是一种常用的模型参数估计方法。它假设观测样本出现的概率最大&#xff0c;也即样本联合概率&#xff08;也称似然函数&#xff09;取得最大值。 为求解方便&#xff0c;对样本联合概率取对…

强烈推荐!!李沐老师《动手学深度学习》最新Pytorch版!

动手学深度学习(PyTorch版)》是由李沐、Aston Zhang和孔德威共同编写的教材&#xff0c;专为深度学习初学者和实践者设计。本书使用PyTorch作为主要的深度学习框架&#xff0c;全面系统地介绍了深度学习的基本理论、常见模型和实际应用技巧。 书中内容包括深度学习的基础知识、…

【YOLOv8】 用YOLOv8实现数字式工业仪表智能读数(一)

上一篇圆形表盘指针式仪表的项目受到很多人的关注&#xff0c;咱们一鼓作气&#xff0c;把数字式工业仪表的智能读数也研究一下。本篇主要讲如何用YOLOV8实现数字式工业仪表的自动读数&#xff0c;并将读数结果进行输出&#xff0c;若需要完整数据集和源代码可以私信。 目录 &…

Html5+Css3学习笔记

Html5 CSS3 一、概念 1.什么是html5 html: Hyper Text Markup Language ( 超文本标记语言) 文本&#xff1a;记事本 超文本&#xff1a; 文字、图片、音频、视频、动画等等&#xff08;网页&#xff09; html语言经过浏览器的编译显示成超文本 开发者使用5种浏览器&#xf…

element ui ts table重置排序

#日常# 今天带的实习生&#xff0c;在遇到开发过程中&#xff0c;遇到了element ui table 每次查询的时候都需要重置排序方式&#xff0c;而且多个排序是由前端排序。 <el-table :data"tableData" ref"restTable"> </<el-table> <script…

谷粒商城实战笔记-24-分布式组件-SpringCloud Alibaba-Nacos配置中心-命名空间与配置分组

文章目录 一&#xff0c;命名空间1&#xff0c;简介1.1&#xff0c;命名空间的主要功能和特点1.2&#xff0c;使用场景1.3&#xff0c;如何指定命名空间 2&#xff0c;命名空间实战2.1&#xff0c;环境隔离2.2&#xff0c;服务隔离 二&#xff0c;配置集三&#xff0c;配置集ID…