原来链表如此简单

news2024/11/16 21:44:10

由于顺序表(数组)的插入、删除操作需要移动大量的元素,影响了运行效率,因此引入了线性表的链式存储——单链表。单链表通过一组任意的存储单元来存储线性表中的数据元素,不需要使用地址连续的存储单元,因此它不要求在逻辑上相邻的两个元素在物理位置上也相邻,所以单链表是非随机存取结构,不能直接找到表中某个特定的结点。查找某个特定的结点时,需要从第一个结点开始遍历,依次查找。

单链表的基本构成

在这里插入图片描述

其中:data表示数据域,用于存放该结点的数据信息;next表示指针域,用于存放相邻下一结点的地址。

单链表中结点类型的描述如下:
struct LNode {
	int data;
	LNode* next;
};

单链表的基本操作

单链表的查找-按值进行查找

查找值x在单链表L中的结点指针(指针即地址)。

算法思想:从单链表的第一个结点开始,依次比较表中各个结点的数据域的值,若某结点数据域的值等于num,则返回该结点的指针;若整个单链表中没有这样的结点,则返回空。

按值查找结点值的算法如下:
LNode *LocateElem(LNode *L, int num) {
	LNode *p = L->next;
	while (p != NULL && p->data != num) {
		p = p->next;
	}
	return p;
}

单链表的查找-按位置进行查找

查找单链表L中第 i(i>0)个位置的结点指针。

算法思想:从单链表的第一个结点开始,顺着指针域逐个往下搜索,直到找到第 i 个结点为止,否则返回最后一个结点的指针域NULL。

按位查找结点值的算法如下:
LNode *GetElem(LNode *L, int i) {
	LNode *p = L->next;
	if (p == NULL) {
		return NULL;
	}
	int j = 1;
	while (p != NULL && j < i) {
		p = p->next;
		j++;
	}
	return p;
}

单链表的建立-头插法

所谓头插法建立单链表就是将新结点插入到当前链表的表头,即头结点之后。如图所示:

在这里插入图片描述

算法思想:首先初始化一个单链表,其头结点为空,然后循环插入新结点*p:将p的next指向头结点的下一个结点,然后将头结点的next指向p。

主要代码:
LNode *p = new LNode; //申请新结点p
p->data = x; //给新结点赋值,x是已知值
p->next = L->next; //将原头结点的next指针域值赋值给新结点next指针域
L->next = p; //将头结点连接到新结点
头插法建立单链表的算法如下:
LNode *HeadInsert() {
	LNode *L = new LNode;  //创建头结点
	L->next = NULL;  //初始时使头结点指向空
	int x;
	while (cin >> x) {
		LNode *p = new LNode;
		p->data = x;
		p->next = L->next;
		L->next = p;
	}
	return L;
}

需要指出的是,头插法建立的单链表中结点的次序和输入数据的顺序不一致,是相反的。若希望两者的顺序是一致的,则可采用尾插法建立单链表。

单链表的建立-尾插法

所谓尾插法建立单链表,就是将新结点插入到当前链表的表尾。如下图所示:

在这里插入图片描述

算法思想:首先初始化一个单链表,然后声明一个尾指针r,让r始终指向当前链表的尾结点,向单链表的尾部插入新的结点*p,将尾指针r的next域指向新结点,再修改尾指针r指向新结点,也就是当前链表的尾结点。最后别忘记插入所有结点之后,将尾结点的指针域置空。

主要代码:
LNode *p = new LNode; //申请新结点p
p->data = x; //给新结点赋值,x是已知值
r->next = p; //在原尾指针所指结点后插入新结点p
r = p; //插入新结点p后,更新尾指针的位置
尾插法建立单链表的算法如下:
LNode *TailInsert() {
	LNode *L = new LNode;
	L->next = NULL;
	int x;
	LNode *r = L;
	while (cin >> x) {
		LNode *p = new LNode;
		p->data = x;
		r->next = p;
		r = p;
	}
	r->next = NULL;
	return L;
}

单链表的插入

情况1:已知相邻结点中的一个(并且是插入后结点的前驱结点X)
在这里插入图片描述

插入步骤:
1.申请新结点p
2.给新结点p赋值
3.将原X结点的next域值赋值给新结点p的next域
4.将X结点连接到p,即将p赋值给X结点的next域

主要代码:
LNode *p = new LNode; //申请新结点p
p->data = x; //给新结点赋值,x是已知值
p->next = X->next; //将原X结点的next域值赋值给新结点p的next域
X->next = p; //X结点连接到p,即将p赋值给X结点的next域

情况2:已知两个相邻结点(前驱结点X,后继结点Y)
在这里插入图片描述

插入步骤:
1.申请新结点p
2.给新结点p赋值
3.将X结点连接到p,即将p赋值给X结点的next域
4.将p结点连接到Y,即将Y赋值给p结点的next域

主要代码:
LNode *p = new LNode; //申请新结点p
p->data = x; //给新结点赋值,x是已知值
X->next = p; //将X结点连接到p,即将p赋值给X结点的next域
p->next = Y; //将p结点连接到Y,即将Y赋值给p结点的next域

单链表的删除

将单链表的第 i 个结点删除。

算法思想:先检查删除位置的合法性,然后从头开始遍历,找到表中的第 i-1 个结点,即被删除结点的前驱结点p,被删除结点为q,修改p的指针域,将其指向q的下一个结点,最后再释放结点q的存储空间。

在这里插入图片描述

删除步骤:
1.将p结点指向原q结点的后驱,即将q结点的next域值赋值给p结点的next域
2.删除q结点,即调用free函数

主要代码:
从头开始遍历,找到表中的第 i-1 个结点(代码过程省略)
q->next = p->next; //将q结点的next域值赋值给p结点的next域
free(q); //删除q结点

后续更新《一章了解栈和队列》,各位看官,关注不迷路!!!

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

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

相关文章

从Multisim到SmartEDA:开启电路设计智能革命

随着科技的飞速发展&#xff0c;电路设计领域也迎来了前所未有的变革。从传统的Multisim软件到新兴的SmartEDA平台&#xff0c;这一转变不仅代表了技术的进步&#xff0c;更预示着电路设计领域即将解锁全新的潜能。 一、Multisim的辉煌与局限 Multisim作为一款经典的电路设计…

比亚迪电池展厅OLED透明屏项目方案

一、项目概述 为满足比亚迪电池展厅在温州地区的现代化展示需求&#xff0c;我们计划于2024年6月实施OLED透明屏项目。该项目旨在通过采用先进的OLED透明屏技术&#xff0c;为展厅提供独特且高效的展示方式&#xff0c;提升观众体验&#xff0c;展示比亚迪电池技术的先进性和创…

「6.25更新日志」JVS·智能BI、逻辑引擎(服务编排)功能更新说明

项目介绍 JVS是企业级数字化服务构建的基础脚手架&#xff0c;主要解决企业信息化项目交付难、实施效率低、开发成本高的问题&#xff0c;采用微服务配置化的方式&#xff0c;提供了 低代码数据分析物联网的核心能力产品&#xff0c;并构建了协同办公、企业常用的管理工具等&am…

使用内部转换处理事件

在异或状态下处理具有内部转换的事件 此示例显示在异或&#xff08;OR&#xff09;状态下使用内部转换处理三个事件时会发生什么。 在异或状态下处理一个事件 此示例显示内部转换的行为。该图表使用outgoing转换的隐式排序。 起初&#xff0c;图表处于休眠状态。状态A处于活…

计算机毕业设计Thinkphp/Laravel+vue高校图书馆借阅系统_i0521

图书馆借阅系统&#xff0c;主要的模块包括首页、个人中心、会员管理、会员等级管理、图书分类管理、图书信息管理、图书借阅管理、借阅服务评价管理、超时费用管理、留言板管理、系统管理等功能。系统中管理员主要是为了安全有效地存储和管理各类信息&#xff0c;还可以对系统…

web课程大作业-科技强国、航天科技

文章目录 概叙科技强国的概述实例分析 代码截图代码连接 概叙 科技强国的概述 一个科技强国在全球范围内具备领先的科技创新能力和竞争力&#xff0c;能够在多个高科技领域内引领创新潮流和技术发展。成为科技强国通常依赖于以下几个关键因素&#xff1a; 经济实力&#xff1…

液体冷却装置

每天一篇行业发展资讯&#xff0c;让大家更及时了解外面的世界。 更多资讯&#xff0c;请关注B站/公众号【莱歌数字】&#xff0c;有视频教程~~ 在这期中&#xff0c;我们的重点是液体基冷却解决方案。这些专利显示了不同发明者所关注的一些显著特征。 嵌入式微通道冷却包 一…

Centos7.9升级OpenSSH版本

升级前先多开几个ssh窗口或者打开telnet&#xff0c;因为升级ssh可能会导致ssh无法登录 一、查看当前版本 ssh -V 升级后的版本 二、开始升级OpenSSH 1.备份配置文件 cd /etc/ssh cp sshd_config{,.bak} cd /etc/pam.d cp sshd{,.bak}2.下载OpenSSH https://mirrors.aliy…

python 函数(方法):递归、匿名函数、闭包函数、装饰器

文章目录 一、递归1.1 什么是递归&#xff1f;1.2 递归的原理及作用1.3 递归的分类1.4 在使用递归时的注意事项1.5 递归的使用 二、匿名函数三、闭包函数3.1 闭包函数和正常函数的使用区别 四、装饰器&#xff08;相当于 Java 中的面向切面编程&#xff09; 一、递归 1.1 什么是…

针对VMWare无法使用鼠标功能键问题

在使用 VMWare 虚拟机的Ubuntu系统时发现无法使用许多鼠标带有额外的功能键&#xff0c;比如常用的前进后退&#xff0c;但是双系统中的Ubuntu没有问题&#xff0c;后来一搜发现是&#xff0c;虚拟系统中不支持这些功能键。因此我们对这个问题进行了解决。 解决方案 1.找到自…

使用 shell 脚本同步 yum 源建立本地私有仓库

文章目录 [toc]事出有因脚本内容前端展示 事出有因 有两方面原因做了这个事情&#xff1a; dockerhub 国内无法访问centos 7 要停止社区支持了 结合两个情况&#xff0c;不久的将来&#xff0c;可能国内也就没有对应的 yum 仓库了&#xff08;现在想找 centos 7 之前的仓库&…

DC/AC电源模块一种效率与可靠性兼备的能源转换解决方案

DC/AC电源模块都是一种效率与可靠性兼备的能源转换解决方案 DC/AC电源模块是一种能够将直流电源&#xff08;DC&#xff09;转换为交流电源&#xff08;AC&#xff09;的设备。它在现代电子设备中扮演着非常重要的角色&#xff0c;因为许多设备需要交流电源才能正常运行。无论…

主播美颜工具:美颜SDK的技术原理与应用

美颜SDK不仅大幅提升了主播的颜值&#xff0c;还极大地改善了用户的观看体验。本文将从美颜SDK的技术原理、应用场景以及未来发展趋势等方面进行深入探讨。 一、美颜SDK的技术原理 美颜SDK的核心在于其强大的图像处理技术&#xff0c;通过实时图像处理算法&#xff0c;对视频中…

无人机螺旋桨理论教学培训课程

本文档为一份详细的关于TYTO机器人公司提供的电机和螺旋桨理论及其实验操作的指南。指南首先概述了材料、实验目标以及实验的介绍部分&#xff0c;随后详细阐述了理论问题、实验步骤和附录内容。实验目的在于通过实际测试来测量和理解不同螺旋桨参数对无人机性能的影响&#xf…

OpenCV cv::Mat到 Eigen 的正确转换——cv2eigen

在进行计算机视觉项目时&#xff0c;我们经常需要处理相机位姿的变换。最近&#xff0c;我在项目中遇到了一个看似简单但实际上颇具挑战性的问题&#xff1a;从 OpenCV 的 cv::Mat 格式转换到 Eigen 库的格式。这个过程中遇到了一些问题&#xff0c;但最终找到了一个稳健的解决…

实现自动化:如何利用阿里云OSS上传文件并自动打标签

在当前数字化时代&#xff0c;数据管理变得愈发重要&#xff0c;特别是对于需要大规模存储和管理文件的场景。阿里云对象存储服务&#xff08;OSS&#xff09;作为业界领先的解决方案&#xff0c;不仅提供了稳定可靠的云存储&#xff0c;还支持丰富的扩展功能&#xff0c;如文件…

文件夹内-资源名称前加序号排列

问题&#xff1a;在文件夹下的资源可以按时间排序&#xff0c;导入unity后资源顺序会乱掉&#xff0c;不方便按顺序赋值&#xff0c;为了方便&#xff0c;通过下面方法在文件夹下统一在资源名称前按顺序加上序号 win11在文件夹内右键&#xff0c;选择——在终端中打开 输入&a…

生命在于学习——Python人工智能原理(4.7)

四、Python的程序结构与函数 4.4 函数 函数能将代码划分为若干模块&#xff0c;每一个模块可以相对独立的实现某一个功能&#xff0c;函数有两个主要功能&#xff0c;分别是降低编程难度和实现代码复用&#xff0c;函数是一种功能抽象&#xff0c;复用它可以将一个复杂的大问…

“基于下垂的多电源分布式控制系统设计”,高分资源,匠心制作,查重5%,下载可用。强烈推荐!!!

“基于下垂的多电源分布式控制系统设计”&#xff0c;高分资源&#xff0c;匠心制作&#xff0c;查重5%&#xff0c;下载可用。强烈推荐&#xff01;&#xff01;&#xff01; 摘要 社会的进步与发展&#xff0c;人们对于能源的需求和依赖越来越大。与此同时&#xff0c;国家…

仓颉编程语言 -- 初识(一)

官网 文档 原生智能化 内嵌AgentDSL的编程框架&#xff0c;自然语言&编程语言有机融合&#xff1b;多Agent协同&#xff0c;简化符号表达&#xff0c;模式自由组合&#xff0c;支持各类智能应用开发。 天生全场景 轻量化可缩放运行时&#xff0c;模块化分层设计&#xf…