当前位置: 首页 > news >正文

【数据结构】【线性表】单链表1—概念即创建(附C语言源码)

单链表的定义

链表用链式存储的方式实现线性表,链表中每个结点元素中需要指向下一个结点的指针(有时候也要指向上一个结点的指针),链表中的每个结点指针只指向下一结点的被叫为单链表。

单链表的创建和初始化

先定义链表的结点元素

//定义单链表结点
struct LNode{				//定义单链表结点类型EleType deta;			//每一个结点存放一个数据元素struct LNode *next;		//指针指向下一个结点
};

由于单链表的物理存储结构是链式的,而不是顺序表的连续空间,因此在表示链表时,只说明头指针,指向链表的第一个结点,结点元素的next指针指向下一个结点构成链表。

对于单链表数据结构,在创建的时候需要强调结点或者强调链表,因此需要两个同类型的不同名字的变量,我们采用typedef进行数据类型重命名。

typedef struct LNode{		//定义单链表结点类型EleType deta;			//每一个结点存放一个数据元素struct LNode *next;		//指针指向下一个结点
}LNode,*LinkList;			//重命名结构体为LNode,*LinkList/*LNode = *LinkList = struct LNode,这三个都是一样的,前两个是最后一个的两个别名*/
/*表示一个链表 LNode *L 强调结点  /  LinkList L 强调链表*//*功能:定义一个单链表输入:L->单链表结构体i->	链表长度输出:单链表最后一个结点说明:
*/
LNode *GetElem(LinkList L,int i){int j=1;						//第一个结点开始LNode *p = L->next;				//初始化p为第一个结点if(i==0)						//链表长度为0return L;					//返回空链表if(i<0)							//链表长度小于0retuen NULL;				//返回空指针while(p!=NULL && j<i){			//遍历构建链表p=p->next;j++;}return p;						//构建完成,返回最后一个结点
}

上述方法定义了**链表关系,但未对链表元素进行定义,也未申请内存空间,最重要的是它返回的是单链表的最后一个结点,单链表又是不可逆的,也就是这返回值没有太大价值。

因此我们需要的是创建一个能够被我们检索使用的单链表,我们需要的是链表的开头而不是结尾。链表的开头分为有头结点无头结点两种,就链表定义而言,不需要头结点也是一个完整的链表,但在实际的运用中发现,没有头结点的单链表在继续数据运算时代码相对复杂(在链表的插入删除中可以体现,后文会讲),因此我们可以采用有头结点的单链表,使得代码简便的同时更加统一。

/*功能:初始化无头结点的链表输入:L->单链表结构体输出:初始化状况 true:初始化成功 false:初始化失败说明:
*/
bool InitList(LinkList &L){L=NULL;return true;
}
/*功能:初始化有头结点的链表输入:L->单链表结构体输出:初始化状况 true:初始化成功 false:初始化失败说明:
*/
bool InitList(LinkList &L){L=(LNode *) malloc(sizeof(LNode));		//申请头结点内存if(L==NULL)								//判断内存申请情况return flase;						//内存不足,分配失败L->next=NULL;							//分配成功,初始化头节点next指针return true;							//头结点初始化成功
}

由于有头结点的单链表具有天然的代码优势,因此在后续的内容中,如没有特殊说明,则代表该单链表为有头结点的单链表。上面我们在创建单链表时存在链表各结点数据未赋值、链表长度固定,链表返回值为链表结尾结点等问题,为此我们可以采用头插入的方法创建链表,即创建一个头结点,然后不断在头结点后插入新结点进行创建。

/*功能:定义一个单链表输入:L->单链表结构体输出:单链表说明:实际返回的是单链表的头结点
*/
LinkList List_HeadInsert(LinkList &L){LNode *s ; int x;L=(LinkList)malloc(sizeof(LNode));			//申请头结点空间L->next=NULL;								//初始化该结点指向NULLscanf("%d",&x);								//输入xwhile(x!9999){								//x不等于9999则开始创建单链表s=(LNode*)malloc(sizeof(LNode));		//申请一个结点空间s->data==x;								//将输入的x作为该结点数据s->next=L->next;						//将原有结点的next给新结点L->next=s;								//原有结点的next指向新结点,完成结点的连接scanf("%d",&x);							//继续输入}return L;									//创建完成,返回单链表
}

上述创建方法涉及单链表的插入可能有点难懂,下一篇我们将讲述单链表的插入。

相关文章:

【数据结构】【线性表】单链表1—概念即创建(附C语言源码)

单链表的定义&#xff0c; 链表用链式存储的方式实现线性表&#xff0c;链表中每个结点元素中需要指向下一个结点的指针&#xff08;有时候也要指向上一个结点的指针&#xff09;&#xff0c;链表中的每个结点指针只指向下一结点的被叫为单链表。 单链表的创建和初始化 先定…...

centos7的maven配置

首先进入conf配置文件夹下的setting.xml 要改两个地方 第一&#xff1a;设置镜像源 <mirror> <id>alimaven</id> <name>aliyun maven</name> <url>https://maven.aliyun.com/nexus/content/groups/public/</url> <mirrorOf>c…...

day57 图论章节刷题Part08(拓扑排序、dijkstra(朴素版))

拓扑排序-117. 软件构建 思路&#xff1a;拓扑排序是经典的图论问题。给出一个有向图&#xff0c;把有向图转成线性的排序就叫拓扑排序&#xff0c;拓扑排序也要检测有向图是否有环&#xff0c;即存在循环依赖的情况&#xff0c;因为这种情况是不能做线性排序的&#xff0c;所…...

【Steam登录】protobuf协议逆向

https://api.steampowered.com/IAuthenticationService/GetPasswordRSAPublicKey/v1 搜索 input_protobuf_encoded定位 input_protobuf_encoded的值就是 o s r.SerializeBody() o i.iI(s) 精准定位 打上条件断点&#xff1a;t ‘Authentication.GetPasswordRSAPublicKey…...

git 对已提交的说明进行编辑

如果提交代码的时候&#xff0c;对上次提交代码的说明不准确的话&#xff0c;例如 1、可以使用 git log 查看代码提交的记录&#xff1b; 2、使用 git commit --amend 命令对上次提交的说明进行编辑&#xff1a; 当显示上次提交的内容的时候&#xff0c;按下键盘 i 键即可编辑…...

CTF —— 网络安全大赛

前言 &#x1f4bb;随着大数据、人工智能的发展&#xff0c;人们步入了新的时代&#xff0c;逐渐走上科技的巅峰。 ⚔科技是一把双刃剑&#xff0c;网络安全不容忽视&#xff0c;人们的隐私在大数据面前暴露无遗&#xff0c;账户被盗、资金损失、网络诈骗、隐私泄露&#xff…...

【大数据测试spark+kafka-详细教程(附带实例)】

大数据测试&#xff1a;Spark Kafka 实时数据处理与窗口计算教程 1. 概述1.1 大数据技术概述1.2 Apache Kafka 与 Spark 的结合 2. 技术原理与流程2.1 Kafka 简介2.2 Spark Streaming 简介2.3 数据流动与处理流程 3. 环境配置3.1 安装依赖项 4. 实例&#xff1a;实时数据处理与…...

如何为 GitHub 和 Gitee 项目配置不同的 Git 用户信息20241105

&#x1f3af; 如何为 GitHub 和 Gitee 项目配置不同的 Git 用户信息 引言 在多个代码托管平台&#xff08;如 GitHub 和 Gitee&#xff09;之间切换时&#xff0c;正确管理用户信息至关重要。频繁使用不同项目时&#xff0c;若用户配置不当&#xff0c;可能会导致意外提交或…...

【Lucene】原理学习路线

基于《Lucene原理与代码分析完整版》&#xff0c;借助chatgpt等大模型&#xff0c;制定了一个系统学习Lucene原理的计划&#xff0c;并将每个阶段的学习内容组织成专栏文章&#xff0c;zero2hero 手搓 Lucene的核心概念和实现细节。 深入的学习和专栏计划&#xff0c;覆盖Lucen…...

Go语言的并发安全与互斥锁

线程通讯 在程序中不可避免的出现并发或者并行&#xff0c;一般来说对于一个程序大多数是遵循开发语言的启动顺序。例如&#xff0c;对于go语言来说&#xff0c;一般入口为main&#xff0c;main中依次导入import导入的包&#xff0c;并按顺序执行init方法&#xff0c;之后在按…...

SpringBoot框架在资产管理中的应用

3系统分析 3.1可行性分析 通过对本企业资产管理系统实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本企业资产管理系统采用Spring Boot框架&#xff0c;JAVA作…...

ElasticSearch备考 -- 集群配置常见问题

一、集群开启xpack安全配置后无法启动 在配置文件中增加 xpack.security.enabled: true 后无法启动&#xff0c;日志中提示如下 Transport SSL must be enabled if security is enabled. Please set [xpack.security.transport.ssl.enabled] to [true] or disable security b…...

【UE5】一种老派的假反射做法,可以用于移动端,或对反射的速度、清晰度有需求的地方

没想到大家这篇文章呼声还挺高 这篇文章是对它的详细实现&#xff0c;建议在阅读本篇之前&#xff0c;先浏览一下前面的文章&#xff0c;以便更好地理解和掌握内容。 这种老派的假反射技术&#xff0c;适合用于移动端或对反射效果的速度和清晰度有较高要求的场合。该技术通过一…...

FasterNet中Pconv的实现、效果与作用分析

发表时间&#xff1a;2023年3月7日 论文地址&#xff1a;https://arxiv.org/abs/2303.03667 项目地址&#xff1a;https://github.com/JierunChen/FasterNet FasterNet-t0在GPU、CPU和ARM处理器上分别比MobileViT-XXS快2.8、3.3和2.4&#xff0c;而准确率要高2.9%。我们的大型…...

QToolbar工具栏下拉菜单不弹出有小箭头

这里说了怎么弹出&#xff1a;Qt 工具栏QToolBar添加带有弹出菜单的QAction_qt如何将action添加到工具栏-CSDN博客 然后如果你是在UI里面建立的action&#xff0c;并拖到了toolbar&#xff0c;并在代码中设置菜单&#xff0c;例如&#xff1a; ui->mytoolbar->setMenu(…...

w025基于SpringBoot网上超市的设计与实现

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0…...

深度学习在推荐系统中的应用

参考自《深度学习推荐系统》&#xff0c;用于学习和记录。 前言 &#xff08;1&#xff09;与传统的机器学习模型相比&#xff0c;深度学习模型的表达能力更强&#xff0c;能够挖掘&#xff08;2&#xff09;深度学习的模型结构非常灵活&#xff0c;能够根据业务场景和数据特…...

软考系统架构设计师论文:论面向对象的建模及应用

试题三 论面向对象的建模及应用 软件系统建模是软件开发中的重要环节,通过构建软件系统模型可以帮助系统开发人员理解系统、抽取业务过程和管理系统的复杂性,也可以方便各类人员之间的交流。软件系统建模是在系统需求分析和系统实现之间架起的一座桥梁,系统开发人员按照软件…...

LSM-TREE和SSTable

一、什么是LSM-TREE LSM Tree 是一种高效的写优化数据结构&#xff0c;专门用于处理大量写入操作 在一些写多读少的场景&#xff0c;为了加快写磁盘的速度&#xff0c;提出使用日志文件追加顺序写&#xff0c;加快写的速度&#xff0c;减少随机读写。但是日志文件只能遍历查询…...

mysql 升级

# 备份数据库数据 mysqldump -u root -p --single-transaction --all-databases > backup20240830.sql; # 备份mysql数据目录&#xff1a; cp -r /data/mysql mysql20240902 # 备份mysql配置文件my.cnf cp -r /etc/my.cnf my.cnf20240902 systemctl stop mysqld tar -x…...

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…...

JavaSec-RCE

简介 RCE(Remote Code Execution)&#xff0c;可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景&#xff1a;Groovy代码注入 Groovy是一种基于JVM的动态语言&#xff0c;语法简洁&#xff0c;支持闭包、动态类型和Java互操作性&#xff0c…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现&#xff08;两者等价&#xff09;&#xff0c;用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例&#xff1a; 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

Qt 事件处理中 return 的深入解析

Qt 事件处理中 return 的深入解析 在 Qt 事件处理中&#xff0c;return 语句的使用是另一个关键概念&#xff0c;它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别&#xff1a;不同层级的事件处理 方…...

ubuntu22.04有线网络无法连接,图标也没了

今天突然无法有线网络无法连接任何设备&#xff0c;并且图标都没了 错误案例 往上一顿搜索&#xff0c;试了很多博客都不行&#xff0c;比如 Ubuntu22.04右上角网络图标消失 最后解决的办法 下载网卡驱动&#xff0c;重新安装 操作步骤 查看自己网卡的型号 lspci | gre…...

微服务通信安全:深入解析mTLS的原理与实践

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、引言&#xff1a;微服务时代的通信安全挑战 随着云原生和微服务架构的普及&#xff0c;服务间的通信安全成为系统设计的核心议题。传统的单体架构中&…...