【数据结构】单链表的基本操作(节点建立、插入删除)
- 1. 单链表的基本操作
- 1.1. 链表的定义
- 1.2. 链表的创建(初始化)
- 1.2.1. 不带头结点的链表
- 1.2.2. 带头结点的链表
- 1.3. 链表的插入和删除
- 1.3.1. 按位序插入
- 1.3.1.1. 带头结点
- 1.3.1.2. 不带头结点
- 1.3.2. 指定节点的后插操作
- 1.3.3. 指定元素的前插操作
- 1.3.4. 按位序删除
- 1.3.4.1. 带头结点
- 1.3.4.2. 不带头结点
- 1.3.5. 指定元素的删除操作
- 1.3.1. 按位序插入
1. 单链表的基本操作
链表是一种基本的数据结构,在很多数据结构中都会使用链表的方式进行建立,所以将链表学会学通透很有必要。
1.1. 链表的定义
链表的定义是基于结构体之上的,一个链表一般需要定义两方面的东西,一个是链表的节点,一个是链表的指针。一个链表的定义示例如下:
typedef struct ListNode {int data;struct ListNode *next;
}LNode,*List;
上述代码中的val是数据域,用来存放数据,next是指针域,用来存放下一个节点的地址。
并且该代码采用了typedef定义了一个别名LNode,用来指代链表的节点,List是链表的指针,用来指向链表的第一个节点。
1.2. 链表的创建(初始化)
链表的创建有两种方式,一种是带头结点的,另一种是不带头节点的。
1.2.1. 不带头结点的链表
不带头结点的链表的创建方式如下:
void InitList(List *L)
{L=NULL;
}
即使得链表的下一个节点为空。
1.2.2. 带头结点的链表
带头结点的链表的创建方式如下:
void InitList(List *L)
{L=(List)malloc(sizeof(LNode));if(L==NULL){return ;//此时表示创建头结点失败}L->next=NULL;//头结点指向的下一个节点为空
}
头结点的好处就在于,当我们需要对链表进行一个操作的时候,不需要专门对链表的第一个节点进行特殊操作,我们只需要对所有的代码编写一个固定的函数,通过传递不同的值就可以实现特定高度功能。
1.3. 链表的插入和删除
1.3.1. 按位序插入
1.3.1.1. 带头结点
链表的插入,需要先找到要插入位置的前后节点,然后创建一个指针,使得前一个节点指向这个指针,这个指针再指向下一个节点。
在按位序插入的过程中,我们需要输入链表的头结点(供遍历寻找目标位置),要插入的位置和元素。
示例代码如下:
bool ListInsert(List *L,int i,int e)
{if(i<1){return false;}LNode *p; //p表示当前指向的是哪个节点int j=0; //j表示的是当前指向节点的位置p=L; //目前先让p指向头节点while(p!=NULL&&j<i-1) //循环找到要插入节点的前一个节点{p=p->next;j++;}LNode *s=(LNode *)malloc(sizeof(LNode));s.data=e;s->next=p->next;p->next=s;return true;
}
1.3.1.2. 不带头结点
不带头结点的插入与带头结点的插入类似,但是相对带头节点来说更加繁琐。
bool ListInsert(List *L,int i,int e)
{if(i<1){return false;}if(i==1){LNode *q=(LNode *)malloc(sizeof(LNode));q->data=e;q->next=L;L=q;}LNode *p; //p表示当前指向的是哪个节点int j=0; //j表示的是当前指向节点的位置p=L; //目前先让p指向头节点while(p!=NULL&&j<i-1) //循环找到要插入节点的前一个节点{p=p->next;j++;}LNode *s=(LNode *)malloc(sizeof(LNode));s.data=e;s->next=p->next;p->next=s;return true;
}
同样传入的是第一个节点的地址,要加入节点的位置和要加入的元素,区别就在于加入要在第一个位置插入元素,就需要特别处理一下。
1.3.2. 指定节点的后插操作
在给定节点后插入节点的操作相对简单,示例代码如下:
bool InsertNextNode(LNode *p,int x)
{if(p==NULL){return false;}LNode *s=(LNode *)malloc(sizeof(LNode));s->next=p->next;p->next=s;s=>data=x;return true;
}
1.3.3. 指定元素的前插操作
在指定元素之前要插入一个元素,最容易想到的办法是将整个链表遍历一遍,之后找到这个元素的前驱节点,转换成后插操作。但是这种办法实现起来较为复杂,所以我们转换一种思维方式,采取新的方法。
我们尝试在指定节点之后先插入一个节点,然后把指定节点的值赋给新节点,之后再把要插入的值赋给旧节点。总而言之就是现在之后插入节点,然后把两个节点的值互换,就相当于将前后节点互换了。示例代码如下:
bool InsertPriorNode(LNode *p,int x)
{if(p==NULL){return false;}LNode *s=(LNode *)malloc(sizeof(LNode));s->next=p->next;p->next=s;s->data=p->data;p->data=x;return true;
}
1.3.4. 按位序删除
1.3.4.1. 带头结点
在带头结点的删除节点操作中,我们需要给函数传递链表的第一个节点的位置,要删除的位置和一个变量用来存储删除节点的元素值。
删除的主要操作是创建一个指针(不分配内存空间)指向要删除的节点,然后让要删除指针前一个节点指向要删除指针的后一个节点,然后将要删除的指针释放内存,从而达到目的。
示例代码如下:
bool ListDelete(List L,int i,int x)
{if(i<1){return false;}LNode *p;int j=0;p=L;while(p!=NULL;j<i-1){p=p->next;j++;}if(p==NULL){return false;}if(p->next==NULL){return false;}LNode *q=p->next;x=q->data;p->next=q->next;free(q);
}
1.3.4.2. 不带头结点
与不带头结点的插入类似,这里不再赘述。
1.3.5. 指定元素的删除操作
删除操作和带头结点的的相似,指定元素和指定元素的插入相似,这里不再赘述!
相关文章:
【数据结构】单链表的基本操作(节点建立、插入删除)
1. 单链表的基本操作 1.1. 链表的定义1.2. 链表的创建(初始化) 1.2.1. 不带头结点的链表1.2.2. 带头结点的链表 1.3. 链表的插入和删除 1.3.1. 按位序插入 1.3.1.1. 带头结点1.3.1.2. 不带头结点 1.3.2. 指定节点的后插操作1.3.3. 指定元素的前插操作1.3…...

DEM格式转换:转换NSDTF-DEM国标数据格式为通用格式,使用ArcGIS工具转换NSDTF-DEM国标.dem文件为通用.tif格式。
DEM格式转换:转换NSDTF-DEM国标数据格式为通用格式,使用ArcGIS工具转换NSDTF-DEM国标.dem文件为通用.tif格式。 *.dem是一种比较常见的DEM数据格式,其有两种文件组织方式,即NSDTF-DEM和USGS-DEM。 (1)NSDT…...

施耐德电气:勾勒未来工业愿景,赋能中国市场
9月19日,第23届中国国际工业博览会(简称“工博会”)在上海隆重召开。作为全球能源管理和自动化领域的数字化转型专家,施耐德电气在工博会现场全方位展现了自身对未来工业的全新视野与深刻见解,不仅展示了其贯通企业设计…...

安防监控产品经营商城小程序的作用是什么
安防监控产品覆盖面较大,监控器、门禁、对讲机、烟感等都有很高用途,家庭、办公单位各场景往往用量不少,对商家来说,市场高需求背景下也带来了众多生意,但线下门店的局限性,导致商家想要进一步增长不容易。…...
php中判断指定字符串是否包含指定字符的封装函数
在 PHP 中,你可以使用内置的字符串函数 strpos() 来判断一个字符串是否包含指定的字符或子字符串。以下是一个简单的封装函数,它使用 strpos() 来判断指定字符串是否包含指定字符,并返回一个布尔值。 function stringContains($string, $cha…...

GICI-LIB源码阅读(三)因子图优化模型
原始 Markdown文档、Visio流程图、XMind思维导图见:https://github.com/LiZhengXiao99/Navigation-Learning 文章目录 三、因子图优化(FGO)1、因子图模型2、因子图优化状态估计模型3、因子图优化求解4、Ceres 非线性最小二乘库5、GICI-LIB 中…...

5、Docker安装mysql主从复制与redis集群
安装mysql主从复制 主从搭建步骤 1.1 新建主服务器容器实例3307 docker run -p 3307:3306 --name mysql-master #3307映射到3306,容器名为mysql-master -v /app/mysql/mydata/mysql-master/log:/var/log/mysql #容器数据卷 -v /app/mysql/mydata/mysql-master/dat…...

【AI视野·今日NLP 自然语言处理论文速览 第四十三期】Thu, 28 Sep 2023
AI视野今日CS.NLP 自然语言处理论文速览 Thu, 28 Sep 2023 Totally 38 papers 👉上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Cross-Modal Multi-Tasking for Speech-to-Text Translation via Hard Parameter Sharing Authors Brian Yan,…...

Unity 制作登录功能01-创建登录的UI并获取输入内容
1.创建UI面板 导入插件TextMesh Pro 2.编写脚本获取用户输入 这里用的是输入框侦听函数,所有UI都可以使用侦听函数 ,需要注意TMP_InputField 这个类是UI中导入的一个插件TextMesh Pro!在代码中需要引用using TMPro; 命名空间! …...

什么是用户画像?
(1)首先用户画像是个动词逻辑,不是名词,就是给用户绘制肖像。 (2)在互联网这个平台上,绘制肖像就相当千给用户打标签 (3)标签通常是人为规定的高度精炼的特征标识,如年龄、性别、地域、兴趣等…...

DevExpress WinForms图表组件 - 直观的数据信息呈现方式!(二)
在上文中(点击这里回顾>>),我们为大家介绍了DevExpress WinForms图表控件的互动图表、图标设计器及可定制功能等,本文将继续介绍DevExpress WinForms图表控件的数据分析、大数据功能等,欢迎持续关注我们哦~ Dev…...

基于AIOps实现智慧园区极简IT运维
随着物联网、云平台、大数据、人工智能等技术的发展,并逐步投入到智慧园区的建设,传统园区数字化转型加快。园区的形式包括产业园区、教育园区、制造业园区、科研园区、社区等等,园区形态不断演进和发展,园区网承载的对象和业务也…...

chatgpt 只会死记硬背吗
本周写两篇关于 chatgpt 的随感,我不善于写文档,所以我的文字多是输出直感和观点,而不是知识,没有关于 chatgpt 的原理和应用,甚至术语也不匹配,反正就是想到哪算哪吧。 都说 chatgpt 没有内在逻辑…...
03-Zookeeper客户端使用
上一篇:02-Zookeeper实战 1. 项目构建 zookeeper 官方的客户端没有和服务端代码分离,他们为同一个jar 文件,所以我们直接引入zookeeper的maven即可, 这里版本请保持与服务端版本一致,不然会有很多兼容性的问题 <…...

自然语言处理(NLP)学习之与HanLP的初相识
目录 前言 一、自然语言处理基本知识 1、NLP类别 2、核心任务 二、Hanlp简要介绍 三、Hanlp云服务能力 1、全新云原生2.x 2、Python api调用 3、Go api调用 4、Java api调用 四、Hanlp native服务 1、本地开发 总结 前言 在ChatGPT的滚滚浪潮下,也伴随着人工智…...

JDBC【DBUtils】
一、 DBUtils工具类🍓 (一)、DBUtils简介🥝 使用JDBC我们发现冗余的代码太多了,为了简化开发 我们选择使用 DbUtils Commons DbUtils是Apache组织提供的一个对JDBC进行简单封装的开源工具类库,使用它能够简化JDBC应用程序的开发,…...

大数据Doris(一):Doris概述篇
文章目录 Doris概述篇 一、前言 二、Doris简介...
vue 基于vue-seamless-scroll无缝滚动的用法和遇到的问题解决
vue 基于vue-seamless-scroll无缝滚动的用法和遇到的问题解决 背景 最近再做一个大屏项目,需要用到表格滚动效果,之前自己写过js实现,最近发现一个组件vue-seamless-scroll可以实现滚动,感觉挺方便的,准备用一下,但是用完之后才发现这个组件有很多坑需要解决.我把用法和一些问…...

SmartX 边缘计算解决方案:简单稳定,支持各类应用负载
在《一文了解近端边缘 IT 基础架构技术需求》文章中,我们为大家分析了边缘应用对 IT 基础架构的技术要求,以及为什么超融合架构是支持边缘场景的最佳选择。值得一提的是,IDC 近日发布的《中国软件定义存储(SDS)及超融合…...

FPGA 多路视频处理:图像缩放+视频拼接显示,HDMI采集,提供2套工程源码和技术支持
目录 1、前言版本更新说明免责声明 2、相关方案推荐FPGA图像缩放方案推荐FPGA视频拼接方案推荐 3、设计思路框架视频源选择IT6802解码芯片配置及采集动态彩条缓冲FIFO图像缩放模块详解设计框图代码框图2种插值算法的整合与选择 视频拼接算法图像缓存视频输出 4、vivado工程1&am…...

CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...

回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...
作为测试我们应该关注redis哪些方面
1、功能测试 数据结构操作:验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化:测试aof和aof持久化机制,确保数据在开启后正确恢复。 事务:检查事务的原子性和回滚机制。 发布订阅:确保消息正确传递。 2、性…...

pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)
目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 (1)输入单引号 (2)万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...

2.3 物理层设备
在这个视频中,我们要学习工作在物理层的两种网络设备,分别是中继器和集线器。首先来看中继器。在计算机网络中两个节点之间,需要通过物理传输媒体或者说物理传输介质进行连接。像同轴电缆、双绞线就是典型的传输介质,假设A节点要给…...

Spring AOP代理对象生成原理
代理对象生成的关键类是【AnnotationAwareAspectJAutoProxyCreator】,这个类继承了【BeanPostProcessor】是一个后置处理器 在bean对象生命周期中初始化时执行【org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization】方法时…...

性能优化中,多面体模型基本原理
1)多面体编译技术是一种基于多面体模型的程序分析和优化技术,它将程序 中的语句实例、访问关系、依赖关系和调度等信息映射到多维空间中的几何对 象,通过对这些几何对象进行几何操作和线性代数计算来进行程序的分析和优 化。 其中࿰…...