单链表的实现和操作

目录

一.前言

二.单链表的定义和结构

三. 单链表的操作


一.前言

        线性表的链式表示又称为非顺序映像或链式映像。简而言之,链表可以理解为由指针链连接的n个结点组成的。其中每一个结点包括数据域和指针域。值得注意的是,与顺序表不同,链表中的逻辑次序与物理次序不一定相同。

二.单链表的定义和结构

        我们称结点只有一个指针域的链表称为单链表或线性链表。注意区分我们后面要学习的双向链表和循环链表。下面我们来看下单链表的组成,单链表可以是这样的结构:

它包含一个头指针,头结点以及所有的结点,其中存储的第一个数据元素的结点称为首元结点。

其中,头指针是必要的,头结点可有可没有。当我们的单链表没有头结点的时候,头指针为空时表示这个单链表是空表。有头结点的时候,头结点的指针域为空时表示空表。 

 由于单链表是由表头唯一确定的,所以单链表可以用头指针的名字来命名,若头指针是L,则把链表称为表L。下面我们来定义一个单链表类型:

typedef struct Lnode{ElemType data;    //结点的数据域struct Lnode* next   //结点的指针域,指向这个struct Lnode的数据类型
}Lnode,*LinkList;       //LinkList为指向结构体Lnode的指针类型

在完成了这一步之后,我们通常使用LinkList L 来定义一个链表L使用Lnode* p来定义一个结点指针p。接着我们对定义好了的单链表来进行初始化:

Status InitList_L(LinkList &L){L=new Lnode;        //给链表L分配内存空间L->next=NULL;       //初始化为一个空表return OK;
}

其中Status就表示一个数据类型,在我之前的博客里面关于顺序表的实现与操作中就有提到。Status后面的InitList_L就表示这个初始化函数的函数名,可以由我们自行定义,但最好是能够见名思意的。

三. 单链表的操作

1.判断链表是否为空

所谓空表就是链表中没有元素,但是头指针和头结点仍然存在。这个算法的核心思路就是判断头结点指针域是否为空,如下所示:

Status ListEmpty(LinkList L){if(L->next)    //表示不是空表,返回0return 0;else            //若是空表则返回1return 1;
}

其中,L->next就表示头结点的指针域,而我们的头指针则就是用L表示的

2. 单链表的销毁

就是从头指针开始,依次释放所有结点。所以可以利用一个循环来实现,循环结束的条件也就是指针指向空。表示没有结点可以再释放了。如下所示:

Status DestroyList_L(LinkList &L){Lnode* p;        //定义一个Lnode类型的指针pwhile(L){        //从头结点开始p=L;            L=L->next;    //指向下一个结点delete p;     //释放结点}return OK;
}

值得注意的是,我们类C语言中要想使用delete来释放一个空间,就得使用new来分配空间。

3. 单链表的清空

就是指链表仍然存在,但是链表中已经没有元素,成为了一个空链表(头指针和头结点仍然存在)

如下所示:

Status ClearList(LinkList &L){Lnode*p,*q;        //定义两个Lnode类型的指针p=L->next;        while(p){        //循环结束条件就是p指向空的时候q=p->next;delete p;p=q;}    
L->next=NULL;        //头结点指针域为空
return OK;
}

4. 求单链表的表长

        如下所示:

Status ListLength(LinkList L){LinkList p;p=L->next;    //p指向第一个结点i=0;while(p){        //遍历单链表,统计结点数i++;p=p->next;}
return i;
}

5. 单链表的取值

就是取单链表中第i个元素的内容。可以从链表的头指针出发,顺着链域next逐个结点往下搜索,直到搜索到第i个结点为止。因此,链表不是随机存取结构。

Status GetElem(LinkList L,int i,ElemType &e){Lnode* p;int j=1;p=L->next;while(p&&j<i){    //向后扫描,直到p为空或者指向到第i个元素为止p=p->next;++j;}
if(!p||j>i) return ERROR;    //如果p指向空了或者j>i,表示链表中并没有这个元素
e=p->date;             //取第i个元素的数据,并通过e返回
return OK;
}

6. 单链表的查找

单链表的查找可分为两种,第一种就是根据指定数据获取该数据所在的位置(地址)。第二种则是根据指定数据获取该数据的位置序号。

如下所示,首先介绍第一种:

Lnode* LocateElem(LinkList L,ElemType e){p=L->next;while(p&&p->data!=e)p=p->next;return p;        //如果找到了就返回对应的地址,如果没找到,也就是p指向空的时候,返回NULL
}

第二种如下:

Status LocateElem(LinkList L,ElemType e){Lnode* p;p=L->next;    int j=1;while(p&&p->data!=e){p=p->next;j++}
if(p) return j;    //如果找到,返回L中值为e的数据元素的位置序号。
else return 0;    //否则返回0,表示没有找到
}

7. 单链表的插入

在第i个结点前插入值为e的新结点。核心思路就是使新结点的指针域指向结点a(i),使结点a(i-1)的指针域指向新结点。如下所示:

Status ListInsert(LinkList &L,int i,ElemType e){Lnode* p;p=L;int j=0;while(p&&j<i-1){    //寻找第i个结点,p指向i-1结点p=p->next;++j}
if(!p||j>i-1) return ERROR;   //i大于表长+1或者小于1,插入位置非法
s=new Lnode;        //生成新结点s
s->data=e;        //新结点s的数据域为e
s->next=p->next;    //将结点s插入到L中去
p-next=s;
return OK;
}

8. 单链表的删除

就是删除第i个结点,如下所示:

Status ListDelete(LinkList& L,int i,ElemType &e){Lnode* p;p=L;int j=0;while(p->next&&j<i-1){    //寻找第i-1个结点,并让p指向它。p=p->next;++j;}if(!(p->next)||j>i-1) return ERROR;    //删除位置不合理q=p->next;                //临时保存被删除结点的地址以备释放p->next=q->next;        //改变要被删除结点前驱结点的指针域e=q->data;            //保存删除结点的数据域delete q;            //释放删除结点的空间
return OK;
}

 

         

 

 

 

 

         

 

        

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

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

相关文章

手写spring简易版本,让你更好理解spring源码

首先我们要模拟spring&#xff0c;先搞配置文件&#xff0c;并配置bean 创建我们需要的类&#xff0c;beandefito&#xff0c;这个类是用来装解析后的bean&#xff0c;主要三个字段&#xff0c;id&#xff0c;class&#xff0c;scop&#xff0c;对应xml配置的属性 package org…

安科瑞邀您走进2024北京电气设计第44届年会

2024年7月11日&#xff0c;2024建筑电气高峰论坛暨北京电气设计第44届年会在京如期而至&#xff0c;各路精英齐聚一堂&#xff0c;围绕智慧建筑、数据中心、工业厂房配电、储能技术等热点问题展开讨论。安科瑞携企业微电网智慧能源的一站式服务解决方案亮相盛会&#xff0c;尽享…

ssh出现Permission denied(publickey,gssapi-keyex,gssapi-with-mic).

目录 1.报错如下 ​编辑2.编辑sshd配置文件 ​编辑3.解决报错 &#x1f310; 无论你是初学者还是经验丰富的专家&#xff0c;都能在这里找到志同道合的朋友&#xff0c;一起进步&#xff0c;共同探索运维领域的各种挑战和机遇。 1.报错如下 2.编辑sshd配置文件 vim /etc/ss…

【安全规范】软件开发安全设计指南(Word文档)

2.1.应用系统架构安全设计要求 2.2.应用系统软件功能安全设计要求 2.3.应用系统存储安全设计要求 2.4.应用系统通讯安全设计要求 2.5.应用系统数据库安全设计要求 2.6.应用系统数据安全设计要求 软件全套精华资料包清单部分文件列表&#xff1a; 工作安排任务书&#xff0c;可行…

PEFT LoRA 介绍(LoRA微调使用的参数及方法)

一 PEFT LoRA 介绍 官网简介如下图&#xff1a; 翻译过来是&#xff1a;低秩自适应(LoRA)是一种PEFT方法&#xff0c;它将一个大矩阵在注意层分解成两个较小的低秩矩阵。这大大减少了需要微调的参数数量。 说的只是针对注意力层&#xff0c;其实我自己平时微调操作注意力层多…

vue3前端开发-小兔鲜项目-登录和非登录状态下的模板适配

vue3前端开发-小兔鲜项目-登录和非登录状态下的模板适配&#xff01;有了上次的内容铺垫&#xff0c;我们可以根据用户的token来判定&#xff0c;到底是显示什么内容了。 1&#xff1a;我们在对应的导航组件内修改完善一下内容即可。 <script setup> import { useUserSt…

Mysql或MariaDB数据库的用户与授权操作——实操保姆级教程

一、问题描述 在日常的工作中,我们需要给不同角色的人员创建不同的账号,他们各自可访问的数据库或权限不一样,这时就需要创建用户和赋予不同的权限内容了。 二、问题分析 1、创建不同的角色账号; 2、给这些账号授予各自可访问数据库的权限。 三、实现方法 Centos8安装…

CHIP第三章作业

一&#xff0c;实验拓扑 二&#xff0c;实验要求 1、R5为ISP&#xff0c;只能进行Ip地址配置&#xff0c;其所有地址均配为公有IP地址; 2、R1和R5间使用PPP的PAP认证&#xff0c;R5为主认证方; R2与R5之间使用ppp的cHAP认证&#xff0c;R5为主认证方; R3与R5之间使用HDLC封装; …

数据结构--单链表代码(王道书上代码手敲!!!)c++

目录 1.带头结点的初始化以及检查单链表是否为空 2.不带头结点的单链表初始化以及表是否为空检查 3.带头结点按位序插入 4.不带头结点的按位序插入 5.带头结点的后插&#xff0c;前插&#xff0c;按位删除&#xff0c;删除固定节点操作 6 不带头结点的后插&#xff0c;前…

SLAM:BALM: 激光雷达映射的捆绑调整【方法解析-1】

目录 摘要I. 引言II. 相关工作III. BA公式及其导数A. 直接BA公式摘要 在视觉SLAM中,滑动窗口关键帧上的局部束调整(BA)已被广泛使用,并被证明在降低漂移方面非常有效。但在激光雷达SLAM中,很少使用BA方法,因为稀疏特征点(如边缘和平面)使得精确的点匹配变得不可能。在…

如何在 SpringBoot 中优雅的做参数校验?

一、故事背景 关于参数合法性验证的重要性就不多说了&#xff0c;即使前端对参数做了基本验证&#xff0c;后端依然也需要进行验证&#xff0c;以防不合规的数据直接进入服务器&#xff0c;如果不对其进行拦截&#xff0c;严重的甚至会造成系统直接崩溃&#xff01; 本文结合…

【Qt】QWidget核心属性相关API

目录 一. enabled——是否可用 二. geometry——几何位置 window frame 三. windowTitle——窗口标题 四. windowIcon——窗口图标 ​qrc文件 五. windowOpacity——透明度 六. cursor——光标 自定义光标 七. font——字体 八. toolTip——提示栏 九. focusPolic…

Web开发:ASP.NET CORE中前端使用Ajax定时获取后端数据

一、低难度&#xff08;刷新a标签&#xff09; 1、需求 给a标签每15s刷新一次&#xff0c;显示最新的时间&#xff08;时间必须由后端获取&#xff09; 应该如何操作呢 2、代码 后端 using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; using Mi…

液态神经网络到底是什么?

液体神经网络是一种应用范围极其广泛的机器学习工具&#xff0c;不仅可以像传统神经网络那样学习并执行图像识别、自然语言处理和语音合成等多种任务&#xff1b;还突破了传统神经网络难以适应随时间变化的新数据的限制&#xff0c;能够应用于医学诊断和自动驾驶等涉及动态和不…

【Plotly-驯化】一文教你通过plotly画出动态可视化多变量分析:create_scatterplotmatrix

【Plotly-驯化】一文教你通过plotly画出动态可视化多变量分析&#xff1a;create_scatterplotmatrix 本次修炼方法请往下查看 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合&#xff0c;智慧小天地&#xff01; &am…

无法解析插件 org.apache.maven.plugins:maven-war-plugin:3.2.3(已解决)

文章目录 1、问题出现的背景2、解决方法 1、问题出现的背景 最开始我想把springboot项目转为javaweb项目&#xff0c;然后我点击下面这个插件 就转为javaweb项目了&#xff0c;但是我后悔了&#xff0c;想要还原成springboot项目&#xff0c;点开项目结构关于web的都移除了&am…

MySql 触发器、存储器练习

一&#xff1a; 触发器 1、建立两个表:goods(商品表)、orders(订单表) 查看数据库&#xff1a;mysql> show databases; 使用数据库&#xff1a;mysql> use mydb16_trigger; 创建goods表&#xff1a; mysql> create table goods(gid char(8) not null primary key, …

海外发稿:打造希腊媒体宣发新局面

随着全球经济一体化的不断深入&#xff0c;企业对于海外市场的拓展需求日益迫切。在这个过程中&#xff0c;媒体宣发作为一种有效的市场推广手段&#xff0c;已经成为企业出海的重要策略之一。希腊&#xff0c;作为欧洲的重要经济体&#xff0c;拥有丰富的文化底蕴和众多的历史…

自动IP地址vs固定IP地址:哪个更快?深度解析与比较

在数字化时代&#xff0c;网络连接已成为我们日常生活和工作中不可或缺的一部分。而在网络配置中&#xff0c;IP地址的选择——无论是自动获取还是固定设置&#xff0c;都是影响网络性能和管理的关键因素之一。许多人常常疑惑&#xff1a;自动IP地址和固定IP地址哪个快一点&…

Linux中如何用ida调试fork后的子进程

原文链接 > https://redqx.github.io/linux/2024/07/24/linux-debugfork.html 本文的一些图片引用可能有一些问题, 比如数据不对劲,但无伤大雅 自己懒得粘贴图片了 环境: wsl-kali-2024 ida-7.7 插件: Lazy_ida, 还有一个什么插件不知道什么名字, 可以把汇编转字节码 …