数据结构———链表

news2024/12/25 18:29:13

链表是经常用到的一种基础数据结构,接下来我们讲讲链表。

链表:

特点:

链表可分为有头/无头链表,循环/无环,双向/单向链表,每个链表节点都包含一个数据和下一个链表节点的地址。

每个链表节点都指向下一个链表节点,以达到连接的目的。

接下来我们基于C语言实现一个无头无环单向链表的增删查改功能。

代码实现:

链表数据结构定义:

首先定义链表节点的数据结构,用于后续链表实现:

typedef struct Node {
	int data;
	struct Node* Next;
}Node;

初始化链表节点:

有了链表的数据结构定义,接下来就应该是用值val初始化一个链表节点,并且返回该新节点的地址

Node* GetNewNode(int val) {
	Node* p = (Node*)malloc(sizeof(Node));
	p->data = val;
	p->Next = NULL;
	return p;
}

销毁链表:

由于使用了malloc函数来分配内存空间,所以我们就必须要实现一个函数用于释放分配的内存空间以防止内存泄漏:

void Free(Node *head) {
	if (head == NULL) {
		return;
	}
	for (Node *p = head, *q; p; p = q) {
		q = p->Next;
		free(p);
	}
	return;
}

链表的插入:

有了初始化和销毁链表的函数,那么接下来我们应该实现一个函数用于链表插入

在链表节点插入过程中,我们的操作顺序一定不能错,假设有链表节点D要插入到链表节点B后,第一步,首先将寻找链表节点B的地址,使链表指针指向链表节点B;

第二步,让链表节点D指向链表节点C;

第三步,让链表节点B指向链表节点D;

至此就完成了链表的插入。

对于头部和尾部的插入则更是简单,对于头部插入,只需要将待插入节点指向链表头部即可;

链表的插入
链表的插入

对于尾部插入,只需要将链表尾部指向待插入链表节点即可。

接下来是插入函数的C语言代码:

Node* Insert(Node* head, int pos, int val) {
	if (pos == 0) {
		Node* p = GetNewNode(val);
		p->Next = head;
		return p;
	}
	Node* p = head;
	for (int i = 0; i < pos - 1; i++) {
		p = p->Next;
	}
	Node* q = GetNewNode(val);
	q->Next = p->Next;
	p->Next = q;
	return head;
}

链表的删除:

假设删除某个链表节点B,我们只需要寻找到该链表节点的前一个链表节点A的地址并且保存链表节点B的地址,让链表节点A指向链表节点B的下一个节点,最后释放链表节点B即可。

其中,操作顺序一定不能改变,一定是先将A链表指向的B节点的下一个节点地址,然后释放链表节点B。

Node* Delete(Node* head, int pos) {
	if (pos == 0) {
		return;
	}
	Node* p = head;
	for (int i = 0; i < pos - 1; i++) {
		p = p->Next;
	}
	Node* q = p->Next;
	p->Next = q->Next;
	return head;
}

链表的查找:

假如查找某个特定数值A的链表节点地址,我们只需要顺序遍历一遍链表即可,若找到该链表节点则返回该节点的地址,反之返回一个NULL即可。

int Check(Node* head, int val) {
	Node* p = head;
	int n = 0;
	for (; p; p = p->Next) {
		if (p->data == val) {
			return n;
		}
		n++;
	}
	return NULL;
}

至此,我们就学习完了链表这一基础数据结构。

如果我的文章对你有所帮助,不妨给我个关注何点赞吧

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

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

相关文章

ESP32开发:2、使用Clion+IDF框架新建ESP32工程

文章目录 背景步骤新建工程编译工程下载代码 参考 背景 使用CLIONIDF框架新建ESP32工程。编译工程&#xff0c;并配置下载。首先需要根据教程1、安装好IDF框架&#xff0c;参考如下&#xff1a; IDF环境搭建 步骤 新建工程 首先找到IDF框架安装路径&#xff0c;我这里的如下…

IMX6ULL-UBOOT外设适配

目录 1.网口移植 2.LCD移植 1.网口移植 100ask 有两个网口,uboot阶段使用网口2,对应的phy是LAN8720A,硬件地址是1,RST引脚对应的是GPIO6_IO6

泽众云真机-上线海外机型测试专栏

泽众云真机平台&#xff0c;2024上半年70机型升级&#xff0c;也包括热门的海外机型。 但是&#xff0c;运营客服反馈&#xff0c;用户找不到平台海外机型在哪里&#xff0c;我们发现海外机型排列位置有问题&#xff0c;用户不易发现。目前问题已解决&#xff0c;上线海外机型测…

读书笔记|《把自己变成稀缺资产》:我们都拥有100分的欲望,却只有1分的耐心。

哈喽&#xff0c;你好啊&#xff0c;我是雷工&#xff01; 最近在读一本书《把自己变成稀缺资产》&#xff0c;其中一章讲到耐心的重要性&#xff0c;很有共鸣。 当今社会&#xff0c;生活节奏越来越快&#xff0c;我们都在急于求成的追求结果&#xff0c;对过程越来越缺乏耐…

uniapp小程序src引用服务器图片时全局变量与图片路径拼接

理论上&#xff0c;应该在main.js中定义一个全局变量&#xff0c;然后在页面的<image>标签上的是src直接使用即可 main.js 页面上 看上去挺靠谱的&#xff0c;实际上小程序后台会报一个错 很明显这种方式小程序是不认的&#xff0c;这就头疼了&#xff0c;还想过另外一个…

Waymo视角革新!MoST:编码视觉世界,刷新轨迹预测SOTA!

论文标题&#xff1a; MoST: Multi-modality Scene Tokenization for Motion Prediction 论文作者&#xff1a; Norman Mu, Jingwei Ji, Zhenpei Yang, Nate Harada, Haotian Tang, Kan Chen, Charles R. Qi, Runzhou Ge, Kratarth Goel, Zoey Yang, Scott Ettinger, Rami A…

RocketMQ可视化界面安装

RocketMQ可视化界面安装 **起因&#xff1a;**访问rocketmq-externals项目的git地址&#xff0c;下载了源码&#xff0c;在目录中并没有找到rocketmq-console文件夹。 git下面文档提示rocketMQ的仪表板转移到了新的项目中&#xff0c;点击仪表板到新项目地址&#xff1b; 下载…

金融科技重塑跨境支付:创新引领全球支付新纪元

一、引言 随着全球化的加速和科技的飞速发展,跨境支付作为国际贸易的“血脉”,正经历着前所未有的变革。金融科技以其强大的创新能力和技术支撑,正在重塑跨境支付领域的格局,推动全球支付行业向更加高效、安全、便捷的方向发展。本文将深入探讨金融科技如何引领跨境支付的创…

特征交叉系列:DeepCross(DCN-V2)理论和实践

DCN之前FM系列特征交叉思路总结 在之前的推荐算法特征交叉系列中&#xff0c;已经介绍了从FM&#xff0c;FFM&#xff0c;到PNN&#xff0c;DeepFM&#xff0c;NFM&#xff0c;AFM这一系列围绕特征交叉展开的算法&#xff0c;这些算法都是以FM为基石&#xff0c;在FM的基础上优…

kali扩容

通过wmware虚拟机–>设置–>添加40G容量的硬盘。 ──(root㉿kali)-[~/桌面] fdisk -lDisk /dev/sda: 40 GiB, 42949672960 bytes, 83886080 sectors …

Meta的开源力作:Lexical框架,富文本的未来

引言 Lexical 是一个由 Facebook&#xff08;现在称为 Meta&#xff09;开源的可扩展 JavaScript Web 文本编辑器框架。 这个框架特别强调了三个核心特性&#xff1a;可靠性、可访问性以及高性能。 旨在为开发者创造最优的开发体验。 以下是 Lexical 框架的几个关键特点和能…

STM32F103单片机工程移植到航顺单片机HK32F103注意事项

一、简介 作为国内MCU厂商中前三阵营之一的航顺芯片&#xff0c;建立了世界首创超低功耗7nA物联网、万物互联核心处理器浩瀚天际10X系列平台&#xff0c;接受代理商/设计企业/方案商定制低于自主研发十倍以上成本&#xff0c;接近零风险自主品牌产品&#xff0c;芯片设计完成只…

flask轻松入门,概念讲解

Hello World Flask 是轻量级web框架&#xff0c;仅保留了核心功能&#xff1a; 请求响应处理模板渲染URL路由 文章目录 Hello Worldflask命令模式python命令模式两种模式对比修改入口文件配置flask命令修改python命令修改 修改端口和地址flask命令修改python命令修改 修改 URL …

SQL Developer管理RESTful 服务

RESTful 服务依赖于ORDS&#xff08;Oracle REST Data Services&#xff09;&#xff0c;所以在进行本实验前&#xff0c;请先确认数据库服务器上的ORDS服务已启动&#xff1a; $ systemctl status ords ● ords.service - Oracle REST Data ServicesLoaded: loaded (/etc/sys…

动态规划7:LCR 166. 珠宝的最高价值

动态规划解题步骤&#xff1a; 1.确定状态表示&#xff1a;dp[i]是什么 2.确定状态转移方程&#xff1a;dp[i]等于什么 3.初始化&#xff1a;确保状态转移方程不越界 4.确定填表顺序&#xff1a;根据状态转移方程即可确定填表顺序 5.确定返回值 题目链接&#xff1a;LCR …

最新版wordpress网创资源美化以及更新自动同步插件

最新更新了美化右侧悬浮图标 底部分类板块&#xff0c;以及文章自动同步插件 1.支持分类替换 将主站同步过来的文章分类进行替换 2.支持本地化文章图片 &#xff08;使用储存桶可能会导致无法保存图片&#xff09; 3.支持自定义文章作者&#xff08;选择多个作者则同步到的…

Python round函数详解

大家好&#xff0c;在 Python 编程中&#xff0c;经常需要对数字进行舍入操作。无论是在金融领域的货币计算&#xff0c;还是科学计算中的数据处理&#xff0c;都可能需要使用到四舍五入功能。为了满足这一需求&#xff0c;Python 提供了一个内置函数 round()&#xff0c;它能够…

Java多线程-初阶1

博主主页: 码农派大星. 数据结构专栏:Java数据结构 数据库专栏:MySQL数据库 JavaEE专栏:JavaEE 关注博主带你了解更多数据结构知识 1. 认识线程&#xff08;Thread&#xff09; 1.线程是什么 ⼀个线程就是⼀个 "执⾏流". 每个线程之间都可以按照顺序执⾏⾃⼰的代…

白酒:茅台镇白酒的精致包装与品牌形象

茅台镇&#xff0c;这个位于中国贵州省的小镇&#xff0c;因其与众不同的自然环境和杰出的酿酒工艺而成为世界著名的白酒产区。作为茅台镇的品牌&#xff0c;云仓酒庄豪迈白酒不仅在品质和口感上追求卓着&#xff0c;更在包装和品牌形象上展现出精致与品味。 云仓酒庄豪迈白酒的…

【vue-admin-template】设置前后端访问地址

最近在使用vue-admin-template模板进行二次开发&#xff0c;GitHub地址&#xff1a; Vue-Admin-Template。 如果要在该项目中设置前后端的访问IP及端口&#xff0c;可以这样做&#xff1a; 前端&#xff1a;在vue.config.js中&#xff1a; 后端&#xff1a;在request.js中&…