【数据结构】【线性表】单链表2—单链表的插入(附C语言源码)

单链表的插入

单链表的插入可以分为按位序插入指定结点的前插和后插
按位序插入
按位序插入,则在链表的第i位插入一个结点,由于链表是物理结构为链式存储的线性表,其存储内存不连续,依靠结点中元素数据中的指针数据指向下一结点,因此要插入一个结点到第i个位置,只需要找到第i-1个元素,将其指针数据给插入结点的指针数据,并将自己的指针数据更新为指向i即可。

/*功能:单链表在第i个位序插入一个结点输入:L->单链表结构体i->插入到第i个位序e->要插入的数据输出:flase:插入失败true :插入成功说明:该函数的插入方式适用于有头结点的单链表
*/bool ListInsert(LinkList &L,int i,ElemType e){if(i<1)						//判断i是否有效return false;			//i无效,插入失败LNode *p=NUll;				//当前结点int j=0;					//当前结点是第几个位置p=L;						//初始化当前节点为头结点while(p!=NULL && j<i-1){	//遍历找到第i-1个结点p=p->next;j++;}if(p==NULL)					//i不合法return flase;			//i不合法,删除失败LNode *s=(LNode *)malloc(sizeof(LNode));//申请插入结点空间if(s==NULL)					//判断空间申请状况return false;			//空间申请失败,插入失败s->data=e;					//将数据e给插入结点s->next=p->next;			//将i-1结点的next给插入结点p->next=s;					//i-1的next指针指向插入结点return true;				//插入成功
}

如果没有头结点,则无法找到第i-1个结点,因此要对i=1时进行特别处理

/*功能:单链表在第i个位序插入一个结点输入:L->单链表结构体i->插入到第i个位序e->要插入的数据输出:flase:插入失败true :插入成功说明:该函数的插入方式适用于没有头结点的单链表,对于i=1时需要特殊处理
*/bool ListInsert(LinkList &L,int i,ElemType e){if(i<1)						//判断i是否在有效return false;			//i无效,插入失败if(i==1){					//在第一个位置插入结点LNode *s=(LNode *)malloc(sizeof(LNode));//申请插入结点空间if(s==NULL)				//判断空间申请状况return false;		//空间申请失败,插入失败s->data=e;				//将数据e给插入结点s->next=L;				//将L指向的结点指针给新结点L=s;					//L指向新结点return true;			//插入成功}LNode *p=NUll;				//当前结点int j=1;					//当前结点是第几个位置p=L;						//初始化p指向第一个结点while(p!=NULL && j<i-1){	//遍历找到第i-1个结点p=p->next;j++;}if(p==NULL)					//i不合法return flase;			//i不合法,删除失败LNode *s=(LNode *)malloc(sizeof(LNode));//申请插入结点空间if(s==NULL)					//判断空间申请状况return false;			//空间申请失败,插入失败s->data=e;					//将数据e给插入结点s->next=p->next;			//将i-1结点的next给插入结点p->next=s;					//i-1的next指针指向插入结点return true;				//插入成功
}

指定结点后插操作
将指定节点的原有的指针数据给插入结点,并更新现在的指针数据指向插入结点

/*功能:单链表在指定结点后插入一个结点输入:*p->指定的结点指针e->要插入的数据输出:flase:插入失败true :插入成功说明:
*/
bool InsertNextNode(LNode *p,ElemType e){if(p==NULL)								//判断插入结点合法性return false;						//结点不合法,插入失败LNode *s=(LNode *)malloc(sizeof(LNode));//申请插入结点空间if(s==NULL)								//判断空间申请状况return false;						//空间申请失败,插入失败s->data=e;								//将数据e给插入结点s->next=p->next;						//将i-1结点的next给插入结点p->next=s;								//i-1的next指针指向插入结点return true;							//插入成功 
}
/*功能:单链表在指定结点后插入一个结点输入:*p->指定的结点指针*s->要插入的结点输出:flase:插入失败true :插入成功说明:
*/
bool InsertNextNode(LNode *p,LNode *s){if(p==NULL)						//判断插入结点合法性return false;				//结点不合法,插入失败s->next=p->next;				//将i-1结点的next给插入结点p->next=s;						//i-1的next指针指向插入结点return true;					//插入成功 
}

指定节点前插操作
在结点后插入很简单,只需要将该结点的next指针给新结点,同时更新该结点的next指针指向新结点。但要在指定结点前插入一个结点,需要找到该结点的前驱结点,又因为单链表不能逆向,因此需要遍历链表。我们也可以通过另一种方法,不找前驱结点,不改变前驱结点的next,而将新结点插入到指定结点的后面,再将指定结点与插入的新结点的所有数据交换,玩一手偷天换日。

/*功能:单链表在指定结点前插入一个结点输入:*p->指定的结点指针e->要插入的数据输出:flase:插入失败true :插入成功说明:
*/
bool InsertPriorNode(LNode *p,ElemType e){if(p==NULL)								//判断插入结点合法性return false;						//结点不合法,插入失败LNode *s=(LNode *)malloc(sizeof(LNode));//申请插入结点空间if(s==NULL)								//判断空间申请状况return false;						//空间申请失败,插入失败s->data=p->data;						//将p的数据给新结点p->data=e;								//将要被插入的数据给ps->next=p->next;						//将p的next给新结点p->next=s;								//将p的next指针指向新结点/*此时新结点的所有内容与p结点完成互换,最终完成偷天换日*/return true;//插入成功
}
/*功能:单链表在指定结点后插入一个结点输入:*p->指定的结点指针*s->要插入的结点输出:flase:插入失败true :插入成功说明:
*/
bool InsertPriorNode(LNode *p,LNode *s){if(p==NULL)				//判断插入结点合法性return false;		//结点不合法,插入失败ElemType temp=s->data;	//创建临时变量temp暂存新结点的数据s->data=p->data;		//将指定结点数据给新结点p->data=temp;			//将新结点的数据换给指定结点s->next=p->next;		//将指定结点的next指针给新结点p->next=s;				//将指定节点的next指针指向新结点return true;			//插入成功
}

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

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

相关文章

JAVA-顺序表ArrayList(实现ArrayList)

1.线性表 线性表 &#xff08; linear list &#xff09; 是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列... 线性表在逻辑上是线性结构&#xff0c;也就说是连续的一条直线。…

DCN DCWS-6028神州数码 AC 设备配置笔记

DCN DCWS-6028神州数码 AC 设备配置笔记 一、前期准备 PC 电脑网络配置 目的:使 PC 能够访问 AC 的 web 管理控制台。配置详情:web 管理控制台地址为 192.168.1.10,将 PC 电脑 IP 地址配置在 192.168.1.1 - 192.168.1.254 网段内,如 192.168.1.110,子网掩码 255.255.255.…

树概念及结构

树概念及结构 6.1 树概念及结构6.1.1 树的概念6.1.2 树的术语解读6.1.3 树的表示 6.1 树概念及结构 6.1.1 树的概念 类似八股文一样的东西&#xff0c;需要记一下。 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系…

MySQL主从复制原理

MySQL主从复制是一种异步、基于日志的、单向的数据库复制技术&#xff0c;它通过在主服务器上启用二进制日志&#xff08;binlog&#xff09;并将其发送给一个或多个从服务器&#xff0c;实现了从服务器与主服务器之间的数据同步。以下是MySQL主从复制原理的详细解释&#xff1…

AMD-OLMo:在 AMD Instinct MI250 GPU 上训练的新一代大型语言模型。

AMD-OLMo是一系列10亿参数语言模型&#xff0c;由AMD公司在AMD Instinct MI250 GPU上进行训练&#xff0c;AMD Instinct MI250 GPU是一个功能强大的图形处理器集群&#xff0c;它利用了OLMo这一公司开发的尖端语言模型。AMD 创建 OLMo 是为了突出其 Instinct GPU 在运行 “具有…

Spring Boot框架:构建符合工程认证的计算机课程

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

实现链式结构二叉树

目录 需要实现的操作 链式结构二叉树实现 结点的创建 前序遍历 中序遍历 后序遍历 计算结点个数 计算二叉树的叶子结点个数 计算二叉树第k层结点个数 计算二叉树的深度 查找值为x的结点 销毁 层序遍历 判断是否为完全二叉树 总结 需要实现的操作 //前序遍历 void …

DU模拟器(S5040A Open RAN Studio Player and Capture Appliance)

下行测试过程&#xff0c;由是德科技(https://www.keysight.com/cn/zh/home.html)的DU模拟器&#xff08;S5040A Open RAN Studio Player and Capture Appliance&#xff09;产生标准5G NR下行测试信号&#xff0c;经前传接口发送到小站进行基带处理、中射频、变频后从相控阵天…

工程认证标准下的Spring Boot计算机课程管理策略

5系统详细实现 5.1 管理员模块的实现 5.1.1 教师信息管理 基于工程教育认证的计算机课程管理平台的系统管理员可以管理教师&#xff0c;可以对教师信息修改删除以及查询操作。具体界面的展示如图5.1所示。 图5.1 教师信息管理界面 5.1.2 通知公告管理 系统管理员可以对通知公…

GeoHash处理经纬度,降维,空间填充曲线

个人博客&#xff1a;无奈何杨&#xff08;wnhyang&#xff09; 个人语雀&#xff1a;wnhyang 共享语雀&#xff1a;在线知识共享 Github&#xff1a;wnhyang - Overview 参考 https://segmentfault.com/a/1190000042971576 GeoHash原理以及代码实现_geohash编码-CSDN博客…

游戏引擎学习第三天

视频参考:https://www.bilibili.com/video/BV1XTmqYSEtm/ 之前的程序不能退出&#xff0c;下面写关闭窗体的操作 PostQuitMessage 是 Windows API 中的一个函数&#xff0c;用于向当前线程的消息队列发送一个退出消息。其作用是请求应用程序退出消息循环&#xff0c;通常用于处…

CSS中常见文本居中技巧详解

在网页设计中&#xff0c;文本居中是非常常见且重要的布局需求之一。无论是为了美观还是为了更好地传达信息&#xff0c;掌握文本居中的方法对于前端开发者来说都是必不可少的技能。本文将详细介绍几种常用的CSS文本居中方法&#xff0c;帮助读者解决实际开发中的问题。 默认情…

Java基础教程(001):Java基础概念:注释、关键字、字面量

文章目录 1、Java基础概念1.1 注释1.2 关键字1.3 字面量1.4 制表符 1、Java基础概念 1.1 注释 【1】注释概念 注释是在程序指定位置添加的说明性信息。 简单理解&#xff0c;就是对代码的一种解释。 【2】注释分类 单行注释&#xff1a;// 注释信息多行注释&#xff1a;/…

SIwave:释放 SIwizard 求解器的强大功能

SIwave 是一种电源完整性和信号完整性工具。SIwizard 是 SIwave 中 SI 分析的主要工具&#xff0c;也是本博客的主题。 SIwizard 用于研究 RF、clock 和 control traces 的信号完整性。该工具允许用户进行瞬态分析、眼图分析和 BER 计算。用户可以将 IBIS 和 IBIS-AMI 模型添加…

Windows10 下通过 Visual Studio2022 编译 openssl 3.4

Windows10 下通过 Visual Studio2022 编译 openssl 3.4 1 准备环境1.2 perl1.2.1 ActiveState Perl 和 Strawberry Perl 的区别1.2.2 perl 下载1.2.3 验证安装1.2 NASM1.2.1 Windows 安装 NASM1.2.2 解压1.2.3 配置 NASM 的环境变量1.3 VS 配置1.3.1 配置 VS nmake 的环境变量1…

了解Hadoop:大数据处理的核心框架

在当今数据爆炸的时代&#xff0c;海量数据的存储和处理已成为一个巨大的挑战。传统数据库和计算模型难以应对如此庞大的数据规模。为了解决这一问题&#xff0c;Apache Hadoop应运而生&#xff0c;它是一种分布式存储和处理框架&#xff0c;能够高效地处理海量数据。本文将详细…

本溪与深圳市新零售产业互联协会共商世界酒中国菜湾区农业发展

本溪满族自治县与深圳市新零售产业互联协会汇聚鹏城共商世界酒中国菜大湾区农业发展大计 2024年11月9日下午2点&#xff0c;深圳市新零售产业互联协会内气氛热烈&#xff0c;一场关乎农业产业发展未来的重要讨论正在这里举行。此次会议汇聚了来自本溪满族自治县和大湾区的众多精…

互联网广告的变现逻辑|计费模式|CPC、CPM、OCPC、OCPM

写在前面 最近的工作和广告相关&#xff0c;就整理一下自己学到的关于互联网广告变现的一些知识。 广告是互联网主要变现手段之一&#xff0c;一般的互联网公司都会有个商业化部门专门做广告的变现。那广告究竟是怎么变现的呢&#xff1f;怎么广告的好坏和什么有关呢&#xff1…

从0开始深度学习(29)——文本预处理

序列数据中&#xff0c;最常见的例子就是文本数据&#xff0c;例如&#xff0c;一篇文章可以被简单地看作一串单词序列&#xff0c;甚至是一串字符序列。 本节中&#xff0c;我们将解析文本的常见预处理步骤。 0 文本预处理步骤 将文本作为字符串加载到内存中。将字符串拆分为…

JDBC学习笔记--JdbcUtil工具类

目录 &#xff08;一&#xff09;为什么要使用JdbcUtil工具类 &#xff08;二&#xff09;创建一个prorperties文件 1.在文件目录或src目录下&#xff0c;选择新建FIle 2.创建properties文件 3.编写配置文件 Java基础&#xff1a;反射 4.获取资源的方式 第一种 第二种…