带头结点 的单链表插入方法(头插法与尾插法)

带头结点的单链表插入方法(头插法与尾插法)

在这里插入图片描述

在单链表的操作中,插入是最常见的操作之一,本文介绍 带头结点的单链表 如何实现 后插法前插法(包括 插入法后插数据交换法),并提供完整的 C++ 代码示例。


1. 链表的基本结构

带头结点 的单链表中,头结点 L 仅作为占位符,不存储数据,链表的数据从 L->next 开始。

#include <stdio.h>
#include <stdlib.h>typedef struct Node {int data;struct Node* next;
} Node, *List;
  • data:存储节点数据。
  • next:指向下一个节点的指针。
  • List:定义指向 Node 的指针类型,表示链表。

2. 链表初始化

bool Init(List &L) {L = (Node *)malloc(sizeof(Node));  // 创建头结点L->next = NULL;return true;
}
  • L 作为头结点,仅占位,不存储数据。
  • L->next = NULL 表示链表为空。

3. 后插法(在指定位置后插入)

3.1 后插法介绍

后插法 是指在 某个指定位置 i 之后 插入新的节点,即:

原链表: A -> B -> C -> NULL
插入后: A -> B -> X -> C -> NULL (X 插入到 B 之后)

3.2 后插法代码

bool Insert(List &L, int i, int value) {Node *p = L;  // p 指向头节点int j = 0;// 找到 i-1 位置的节点while (p != NULL && j < i - 1) {  p = p->next;  j++;}if (p == NULL) { // 如果 i 超出链表长度,插入失败return false;}// 创建新节点Node *s = (Node *)malloc(sizeof(Node));s->data = value;// 插入s->next = p->next;p->next = s;return true;
}

3.3 代码解析

  1. 找到 i-1 位置的节点
    • 通过 while 循环找到第 i-1 个节点 p,使 p->next 指向新节点。
  2. 创建新节点 s
    • 分配内存,存入 value
  3. 新节点 s 指向 p->next
    • s->next = p->next,让新节点连接到 p 的下一个节点。
  4. p 连接到 s
    • p->next = s,完成插入。

3.4 运行示例

void PrintList(List L) {Node *p = L->next;  // 跳过头节点while (p != NULL) {printf("%d -> ", p->data);p = p->next;}printf("NULL\n");
}int main() {List L;Init(L);Insert(L, 1, 10);Insert(L, 2, 20);Insert(L, 3, 30);PrintList(L);return 0;
}
运行结果
10 -> 20 -> 30 -> NULL

4. 后插法实现前插法(交换数据法)

4.1 介绍

前插法 是指在 某个指定位置 i 之前 插入新节点:

原链表: A -> B -> C -> NULL
插入后: A -> X -> B -> C -> NULL (X 插入到 B 之前)

如果我们仍然使用后插法,可以通过 交换数据 来模拟前插效果:

  1. 找到 i 位置的节点 p
  2. 使用后插法p 后面 插入一个新节点 s
  3. 交换 psdata,这样 p 的数据变成新插入的数据,而 s 变成原 p 的数据。

当然 这里也可以使用 直接插入法 不过 需要从头 遍历链表 至其前驱结点 ,这里没有实现

4.2 代码

bool Insert(List &L, int i, int value) {if (i < 1) return false;Node *p = L;int j = 0;// 找到第 i 个位置的节点 pwhile (p->next != NULL && j < i - 1) {  p = p->next;j++;}if (p == NULL) return false;// 使用后插法创建新节点 sNode *s = (Node *)malloc(sizeof(Node));s->data = value;s->next = p->next;p->next = s;// **交换数据**,实现前插效果int temp = p->data;p->data = s->data;s->data = temp;return true;
}

4.3 运行示例

int main() {List L;Init(L);Insert(L, 1, 10);Insert(L, 2, 20);Insert(L, 3, 30);Insert(L, 2, 15); // 插入 15 到第 2 个位置PrintList(L);return 0;
}
输出
10 -> 15 -> 20 -> 30 -> NULL

15 被正确插入到了 20 之前,达到了前插的效果


5. 总结

后插法前插法(交换数据法)
插入方式i 个节点 之后插入i 个节点 之前插入
链表变化A -> B -> X -> CA -> X -> B -> C
i=1 时的情况头结点不变,只插入到 L->next 之后头结点改变,新节点变成 L
适用场景常用于 顺序插入,如尾插法适用于 倒序插入,如头插法
优点逻辑清晰,适用于大多数情况结构不变,适用于数据交换优化

两种插入方式的使用场景不同,在 动态链表管理 中,后插法适合 正常数据流,前插法适合 逆序处理


6. 参考代码完整示例

#include <stdio.h>
#include <stdlib.h>typedef struct Node {int data;struct Node* next;
} Node, *List;bool Init(List &L) {L = (Node *)malloc(sizeof(Node));L->next = NULL;return true;
}bool Insert(List &L, int i, int value) {if (i < 1) return false;Node *p = L;int j = 0;while (p->next != NULL && j < i - 1) {  p = p->next;j++;}if (p == NULL) return false;Node *s = (Node *)malloc(sizeof(Node));s->data = value;s->next = p->next;p->next = s;int temp = p->data;p->data = s->data;s->data = temp;return true;
}

希望本文能帮助新手更好地学习C++链表的学习!

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

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

相关文章

Prometheus的工作流程

Prometheus 是一个开源的监控和告警系统&#xff0c;专为监控分布式系统而设计。它的工作流程主要包括以下几个关键步骤&#xff1a; 1. 数据采集 (Scraping) 目标发现 (Service Discovery)&#xff1a; Prometheus 自动或手动配置监控目标&#xff0c;通过 DNS、Kubernetes、…

软件工程面试题(二十二)

1、常用的设计模式有哪些&#xff1f;并写出一段程序代码 Factory(工厂模式)&#xff0c;Adapter(适配器模式)&#xff0c;Singleton(单例模式)&#xff0c;State(状态模式)&#xff0c;Observer(观察者模式) 等。 单例模式 public class Singleton{ private static Singleton …

【Pandas】pandas DataFrame select_dtypes

Pandas2.2 DataFrame Attributes and underlying data 方法描述DataFrame.index用于获取 DataFrame 的行索引DataFrame.columns用于获取 DataFrame 的列标签DataFrame.dtypes用于获取 DataFrame 中每一列的数据类型DataFrame.info([verbose, buf, max_cols, …])用于提供 Dat…

如何利用ATECLOUD测试平台的芯片测试解决方案实现4644芯片的测试?

作为多通道 DC-DC 电源管理芯片的代表产品&#xff0c;4644 凭借 95% 以上的转换效率、1% 的输出精度及多重保护机制&#xff0c;广泛应用于航天航空&#xff08;卫星电源系统&#xff09;、医疗设备&#xff08;MRI 梯度功放&#xff09;、工业控制&#xff08;伺服驱动单元&a…

Python 编程实战:打造高效便捷的目录结构生成器

Python 编程实战&#xff1a;打造高效便捷的目录结构生成器 相关资源文件已经打包成EXE文件&#xff0c;可双击直接运行程序&#xff0c;且文章末尾已附上相关源码&#xff0c;以供大家学习交流&#xff0c;博主主页还有更多Python相关程序案例&#xff0c;秉着开源精神的想法&…

移动端六大语言速记:第6部分 - 错误处理与调试

移动端六大语言速记:第6部分 - 错误处理与调试 本文将对比Java、Kotlin、Flutter(Dart)、Python、ArkTS和Swift这六种移动端开发语言在错误处理与调试方面的特性,帮助开发者理解和掌握各语言的异常处理机制。 6. 错误处理与调试 6.1 异常处理 各语言异常处理的语法对比:…

PyTorch优化器

PyTorch 提供了多种优化算法用于神经网络的参数优化。以下是对 PyTorch 中主要优化器的全面介绍&#xff0c;包括它们的原理、使用方法和适用场景。 一、基本优化器 1. SGD (随机梯度下降) torch.optim.SGD(params, lr0.01, momentum0, dampening0, weight_decay0, nesterov…

C++的UDP连接解析域名地址错误

背景 使用c开发一个udp连接功能的脚本&#xff0c;可以接收发送数据&#xff0c;而且地址是经过内网穿透到外网的 经过 通常发送数据给目标地址&#xff0c;需要把目的地址结构化&#xff0c;要么使用inet_addr解析ip地址&#xff0c;要么使用inet_pton sockaddr_in target…

Spark,上传文件

上传文件 1.上传 先使用命令打开HDFS的NameNode [roothadoop100 hadoop-3.1.3]$ sbin/start-dfs.sh [roothadoop100 hadoop-3.1.3]$ sbin/stop-dfs.sh 和YARN的Job [roothadoop101 hadoop-3.1.3]$ sbin/start-yarn.sh [roothadoop101 hadoop-3.1.3]$ sbin/stop-yarn.sh 在Nam…

如何为Linux/Android Kernel 5.4和5.15添加 fuse passthrough透传功能 ?

背景 参考&#xff1a;Google文档 FUSE 透传 参考此文档&#xff0c;目前kernel.org提供的fuse passthrough补丁在6.9版本之后&#xff0c;但想要在5.4和5.15版本内核做移植应该如何简单点呢&#xff1f;文档中提到 Android的内核为5.4 和 5.15版本内核做了fuse passthrough功…

Ubuntu 防火墙配置

Ubuntu 的防火墙配置可以参考文章&#xff1a;Firewall - Ubuntu Server documentation 22 端口 需要注意的是&#xff0c;在启动防火墙之前&#xff0c;需要先开放 22 端口。 否则 SSH 将会拒绝你连接防火墙。 开放 22 端口的命令为&#xff1a;sudo ufw allow 22 添加端…

Jetson 设备卸载 OpenCV 4.5.4 并编译安装 OpenCV 4.2.0

‌一、卸载 OpenCV 4.5.4‌ 清除已安装的 OpenCV 库‌ sudo apt-get purge libopencv* python3-opencv # 卸载所有APT安装的OpenCV包‌:ml-citation{ref"1,3" data"citationList"}sudo apt autoremove # 清理残留依赖‌:ml-citation{ref"1,4"…

《AI大模型应知应会100篇》第57篇:LlamaIndex使用指南:构建高效知识库

第57篇&#xff1a;LlamaIndex使用指南&#xff1a;构建高效知识库 摘要 在大语言模型&#xff08;LLM&#xff09;驱动的智能应用中&#xff0c;如何高效地管理和利用海量知识数据是开发者面临的核心挑战之一。LlamaIndex&#xff08;原 GPT Index&#xff09; 是一个专为构建…

Sentinel[超详细讲解]-4

&#x1f693; 主要讲解流控模式的 三种方式中的两种&#xff1a; 直接、链路&#x1f680; 1️⃣ 直接模式 &#x1f68e; 直接模式&#xff1a;对资源本身进行限流&#xff0c;例如对某个接口进行限流&#xff0c;当该接口的访问频率超过设定的阈值时&#xff0c;直接拒绝新的…

工作记录 2017-03-24

工作记录 2017-03-24 序号 工作 相关人员 1 修改了邮件上的问题。 更新RD服务器。 郝 更新的问题 1、修改了New User时 init的保存。 2、文件的查询加了ID。 3、加了 patient insurance secondary 4、修改了payment detail的处理。 识别引擎监控 Ps (iCDA LOG :剔除…

裴蜀定理:整数解的奥秘

裴蜀定理&#xff1a;整数解的奥秘 在数学的世界里&#xff0c;裴蜀定理&#xff08;Bzout’s Theorem&#xff09;是数论中一个非常重要的定理&#xff0c;它揭示了二次方程和整数解之间的关系。它不仅仅是纯粹的理论知识&#xff0c;还在计算机科学、密码学、算法优化等多个…

python之 “__init__.py” 文件

提示&#xff1a;python之 “init.py” 文件 文章目录 前言一、Python 中 __init__.py 文件的理解1. What&#xff08;是什么&#xff09;2. Why&#xff08;为什么需要&#xff09;3. Where&#xff08;在哪里使用&#xff09;4. How&#xff08;如何使用&#xff09; 二、问题…

Gemini 2.5 Pro与Claude 3.7 Sonnet编程性能对比

AI领域的语言模型竞赛日趋白热化,尤其在编程辅助方面表现突出。 Gemini 2.5 Pro和Claude 3.7 Sonnet作为该领域的佼佼者,本文通过一系列编程测试与基准评估对两者的编码功能进行对比分析。 核心结论: • Gemini 2.5 Pro在SWE Bench硬核编程测试中以63.8%的通过率略胜Clau…

On Superresolution Effects in Maximum Likelihood Adaptive Antenna Arrays论文阅读

On Superresolution Effects in Maximum Likelihood Adaptive Antenna Arrays 1. 论文的研究目标与实际问题意义1.1 研究目标1.2 解决的实际问题1.3 实际意义2. 论文提出的新方法、模型与公式2.1 核心创新:标量化近似表达式关键推导步骤:公式优势:2.2 与经典方法的对比传统方…

GIT 撤销上次推送

注意&#xff1a;在执行下述操作之前先备份现有工作进度&#xff0c;如果不慎未保存&#xff0c;在代码编辑器中正在修改的文件下&#xff0c;使用CtrlZ 撤销试试 撤销推送的方法 情况 1&#xff1a;您刚刚推送到远程仓库 如果您的推送操作刚刚完成&#xff0c;并且没有其他…