单向链表基本操作

news2024/11/22 11:24:06

目录

初始化链表

插入

删除

遍历

销毁

清空


初始化链表

代码:

struct LinkNode* Init_LinkList() {
	struct LinkNode* head = (struct LinkNode*)malloc(sizeof(struct LinkNode));
	head->data = -1;
	head->next = NULL;
	// 尾部指针
	struct LinkNode* pRear = head;
	int val = -1;
	while (true) {
		printf("输入插入的数据:\n");
		scanf("%d", &val);
		if (val == -1) {
			break;
		}
		// 先创建新节点
		struct LinkNode* newnode = (struct LinkNode*)malloc(sizeof(struct LinkNode));
		newnode->data = val;
		newnode->next = NULL;
		// 新节点插入到链表
		pRear->next = newnode;

		// 更新尾部指针指向
		pRear = newnode;
	}
	return head;
}
插入

在值为oldval的位置插入一个新的数据 

代码: 

void InsertByValue_LinkList(struct LinkNode* head, int oldval, int newval) {
	if (head == NULL) {
		return;
	}
	// 两个辅助指针变量
	struct LinkNode* pPrev = head;
	struct LinkNode* pCurrent = pPrev->next;
	while (pCurrent != NULL) {
		if (pCurrent->data == oldval) {
			break;
		}
		pPrev = pCurrent;
		pCurrent = pCurrent->next;
	}

	// 先创建新节点
	struct LinkNode* newnode = (struct LinkNode*)malloc(sizeof(struct LinkNode));
	newnode->data = newval;
	newnode->next = NULL;

	// 新节点插入到链表中
	newnode->next = pCurrent;
	pPrev->next = newnode;

}
删除

删除值为val的节点 

代码:

void RemoveByValue_LinkList(struct LinkNode* head, int delValue) {
	
	if (head == NULL) {
		return;
	}
	// 两个辅助指针变量
	struct LinkNode* pPrev = head;
	struct LinkNode* pCurrent = pPrev->next;

	while (pCurrent != NULL) {
		if (pCurrent->data == delValue) {
			break;
		}
		// 移动两个辅助指针
		pPrev = pCurrent;
		pCurrent = pCurrent->next;
	}

	if (pCurrent == NULL) {
		return;
	}

	// 重新建立待删除节点的前驱和后继节点的关系
	pPrev->next = pCurrent->next;
	// 释放删除节点内存
	free(pCurrent);
	pCurrent = NULL;
}
遍历
void Foreach_LinkList(struct LinkNode* head) {
	if (head == NULL) {
		return NULL;
	}

	// 辅助指针变量
	struct LinkNode* pCurrent = head->next;
	while (pCurrent != NULL)
	{
		printf("%d ", pCurrent->data);
		pCurrent = pCurrent->next;
	}

}
销毁
void Destroy_LinkList(struct LinkNode* head) {
	if (NULL == head) {
		return;
	}

	// 辅助指针变量
	struct LinkNode* pCurrent = head;
	while (pCurrent != NULL) {
		// 先保存下当前节点的下一个节点地址
		struct LinkNode* pNext = pCurrent->next;

		// 释放当前节点内存
		printf("%d节点被销毁!", pCurrent->data);
		free(pCurrent);
		
		// 指针向后移动
		pCurrent = pNext; 
	}
}
清空
void Clear_LinkList(struct LinkNode* head) {
	if (head == NULL) {
		return;
	}

	// 辅助指针变量
	struct LinkNode* pCurrent = head->next;
	while (pCurrent != NULL) {
		// 先保存下当前节点的下一个节点地址
		struct LinkNode* pNext = pCurrent->next;

		// 释放当前节点内存
		free(pCurrent);

		// pCurrent指向下一个节点
		pCurrent = pNext;
	}
	head->next = NULL;
}

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

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

相关文章

概率论的学习和整理15: 超几何分布,二项分布,泊松分布是如何趋近收敛的?

目录 1 问题: 2 结论 3 实验1 4 实验2 5 实验3 6 实验4 5 各种规律总结 5.1 1 5.2 2 5.3 3 5.4 4 6 超几何分布,二项分布,泊松分布,三者用EXCEL模拟 6.1 简单的扩展到泊松分布 6.2 比较整体的动态过程&…

在qt界面上内嵌拥有独立句柄的窗口

背景 在qt程序中,如果数据刷新频率过高,容易造成窗口卡顿,因为qt程序是整个窗口刷新,在此种背景下可以在qt程序的主程序上内嵌一个拥有独立句柄的窗口,两个窗口刷新就互不干扰。 案例 以下例子,在主窗口…

【技术指南】3D转换工具HOOPS Exchange的功能特征和典型使用场景全解析(一)

一、什么是 HOOPS Exchange? HOOPS Exchange 是一组软件库,可以帮助开发人员在开发应用程序时读取和写入主流的 2D 和 3D 格式。HOOPS Exchange 支持 在主流的3D 文件格式中读取 CAD 数据,并支持将 3D 数据转换为 PRC 数据格式,…

2.2 顺序表与链表特性对比

1. 插入删除操作对比 1. 顺序表插入删除元素 插入策略: 在某个位置插入元素时, 把从该位置开始的所有元素都往后挪一个位置, 规定顺序表最后一个元素后面的位置也是一个可插入位置. 后面的元素先往后挪动位置. 删除策略: 在某位置删除元素, 把从该位置之后的所有元素都往前…

【技术篇】• 饮用水除硝酸盐的技术解析

​​​​​​​ 近年来由于农业活动及排污物的影响,部分地表水源水中硝酸盐含量呈现明显的增加趋势,硝酸盐污染成为地下水和饮用水领域关注的热点问题之一。 硝酸盐是有氧环境中稳定的含氮化合物形式,也是含氮有机物通过无机化分解的产物&am…

搭建archetype骨架工程

搭建archetype骨架工程 一、archetype概念1、archetype简介2、archetype组成结构3、archetype生命周期4、archetype使用 二、构建我们自定义的骨架工程1、创建一个自定义的项目2、修改pom的build插件3、生成archetype资源文件4、将生成的资源文件制作成archetype jar包5、生成a…

Java中不同变量声明类型

今天在学习分层解耦-三层架构的过程中,具体文章参照:写文章-CSDN创作中心 在Servie层创建Dao对象时,以及在Controller层创建Service对象时,发现与我之前了解的声明变量的方法不一样。具体关键代码如下: 其中EmpServic…

简要介绍 | 边缘计算:原理,研究现状与未来展望

注1:本文系“简要介绍”系列之一,仅从概念上对边缘计算进行非常简要的介绍,不适合用于深入和详细的了解。 边缘计算:原理,研究现状与未来展望 What is Edge Computing? | Moving Intelligence to the Edge 一、背景介…

小平板 大智慧-嵌入式方案满足教育市场多元需求

线上教育观念的深入和技术的更新,直接拉动了教育类硬件及相关终端设备的市场需求。 产品框图 IDO-SBC3566采用瑞芯微RK3566, CPU采用4核A55架构处理器,集成G52图形处理器,内置独立NPU,算力高达1Tops,可满足…

如何在 Windows 中免费合并 PDF 文件 [在线和离线]

PDF是一种广泛使用的文件格式,具有兼容性好、安全性高、易于打印、方便浏览等众多优点。在工作和学习过程中,经常需要将同一类型的PDF文件合并起来,以方便传输和查看,使得合并PDF文件成为一种重要的数据整合方法。 如果您想知道如…

Es存储和查询

基本概念 Cluster 集群,一个ES集群是由多个节点(Node)组成的,每个集群都有一个cluster name 作为标识, 在同一网段下的Es实例会通过cluster name 决定加入哪个集群下。 node 节点,一个ES实例就是一个node,一个机器可以…

电气控制与PLC之间的本质区别是什么?

电气控制和PLC(可编程逻辑控制器)之间的最实质的区别是它们的实现方式和应用范围。 我这里刚好有嵌入式、单片机、plc的资料需要可以私我或在评论区扣个6 实现方式: 电气控制:电气控制是通过使用电气元件(如继电器、…

数据库多表连接查询练习

数据库多表连接查询练习 一、创建数据库dept、emp 二、插入数据 1.找出销售部门中年纪最大的员工的姓名 mysql> select name,age from emp inner join dept on dept.dept1emp.dept2 where dept_name销售 order by age desc limit 1;2.求财务部门最低工资的员工姓名…

探索AI大模型:现状、挑战与未来

导言: 近年来,AI大模型如GPT(生成对抗网络)在自然语言处理领域崭露头角,引发广泛关注和讨论。这些模型能够生成各种类型的文本内容,展现出惊人的语言处理能力。然而,AI大模型的发展也面临着挑战…

Perl web - Mojolicious 小记

文章目录 关于 Mojolicious安装 关于 Mojolicious Mojolicious是Perl语言比较流行的异步Web开发框架。 官网:https://mojolicious.orggithub : https://github.com/mojolicious/mojo示例:https://github.com/mojolicious/mojo/tree/main/examples 相关…

【雕爷学编程】Arduino动手做(138)---64位WS2812点阵屏模块8

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&am…

移动端 滚动穿透

文章目录 滚动穿透弹窗内容滚动到底部后带动底层页面滚动在弹窗出现时可以直接通过页面滚动条滚动 禁用底层页面滚动弹出层将覆盖整个视口禁用触摸事件监听弹出层滚动位置阻止弹出层的滚动事件冒泡 滚动穿透 当一个固定定位(fixed)或绝对定位&#xff0…

Windows10 网页版 上线!最具扩展性的webos

模仿Windows10 UI 框架 Vue3 点击进入github 链接: https://github.com/royalknight56/win10-vue3 本框架可以让你的页面像win10视窗系统一样,运行一个网页上的win10系统。 本框架可能是最具扩展性的webos 本框架相较于其他的特点是, 具有文件系统&am…

第二章:类与对象(上)

系列文章目录 文章目录 系列文章目录前言面向过程和面向对象初步认识类的引入类的定义类的两种定义方式成员变量命名规则的建议 类的访问限定符及封装访问限定符面试题 封装面试题 类的作用域类的实例化类对象模型如何计算类对象的大小类对象的存储方式猜测对象中包含类的各个成…

C语言字节序

C语言字节序分为大端序和小端序。 大端序: 高字节先存储,也就是数据的高字节存储在低地址中。 小端序: 低字节先存储,也就是数据的低字节存储在低地址中。 例如: short a 01234; char *p &a; printf(&qu…