c语言专题之单链表的实现
在之前的博客中小编已经讲解了顺序表及其应用,所以在将讲单链表之前,我们先来重新思考一下顺序表,这里我先来讲顺序表的几个小缺点:
1.顺序表中在我们数据时,如头插、在指定位置插入等,我们通常需要整体挪动数据,这样一般会使代码更加复杂。
2.顺序表中当我们的空间不够时,我们会进行增容,而增容我们一般会选择成倍数的增加,这样有时就会导致我们空间的浪费!
3.我们通过realloc增容,需要申请新空间,有时还需要拷贝数据,释放旧空间。这样就会导致有性能的消耗!
那么以上问题该怎么解决呢?这就要提到我们接下来要讲的单链表了!
一、链表的概念及结构
1.概念:相较于顺序表在物理上和逻辑上都是连续的,链表是⼀种物理存储结构上⾮连续、⾮顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。
2.结构:链表的结构跟火车车厢相似,淡季时车次的车厢会相应减少,旺季时车次的车厢会额外增加几节。只需要将火车里的某节车厢去掉或加上,不会影响其他车厢,每节车厢都是独⽴存在的。如下图:
⻋厢是独⽴存在的,且每节⻋厢都有⻋⻔。想象⼀下这样的场景,假设每节⻋厢的⻋⻔都是锁上的状 态,需要不同的钥匙才能解锁,每次只能携带⼀把钥匙的情况下如何从⻋头⾛到⻋尾? 最简单的做法:每节⻋厢⾥都放⼀把下⼀节⻋厢的钥匙。这里的钥匙就是指针!在链表中就是这样的:
与顺序表不同的是,单链表⾥的每节"⻋厢"都是独⽴申请下来的空间,我们称之为“结点/节点”
节点的组成主要有两个部分:当前节点要保存的数据和保存下⼀个节点的地址(指针变量)
图中指针变量plist保存的是第⼀个节点的地址,我们称plist此时“指向”第⼀个节点,如果我们希望plist“指向”第⼆个节点时,只需要修改plist保存的内容为0x0012FFA0。
为什么还需要指针变量来保存下⼀个节点的位置呢?
链表中每个节点都是独⽴申请的(即需要插⼊数据时才去申请⼀块节点的空间),我们需要通过指针变量来保存下⼀个节点位置才能从当前节点找到下⼀个节点。
结合前⾯学到的结构体知识,我们可以给出每个节点对应的结构体代码: 假设当前保存的节点为整型:
这个结构体我们需要在一个.h文件中实现,而我们后续要写的函数则保存在一个.c文件中,然后另需一个test.c文件用来测试我们的代码。
接下来小编就来讲单链表的实现了!
二、单链表的实现
1.插入数据
在插入数据之前,我们需要先创建一个plist指针并使其为空,然后这个指针在后续就用来指向单链表的第一个节点了!
然后我们就可以开始写插入数据的函数了!如上,我定义了一个尾插函数SLPushBack,,并将plist指针的地址作为参数上传,注意:这里传指针的地址的原因是因为我们后续要修改plist指针,使其成为链表中第一个元素的地址!而后面的”1“则只是代表我们要插入的数据了。接下来我来讲解尾插,请看以下代码:
以上有两个函数,第一个函数SLTbyeNode用来申请节点,第二个函数SLPushBack及是尾插函数,尾插函数里面就会用到第一个用来申请节点的函数!下面我来分别介绍两个函数:
SLTbyeNode申请节点:由于在链表中我们是一个一个的插入数据并不用扩容,所以我们这里用的是malloc函数来申请空间!申请完之后我们需要判断是否申请成功,若成功就可以继续给结构体中的data和next数据赋值了!这样我们就创建好了一个节点并给他赋值好了数据!
SLPushBack尾插:在尾插函数中我们先创建了一个newnode指针来接收我们之前创建好的节点的地址,然后我们的下一步就是将这个节点连接到链表的最后一个节点的后面去,当然若链表为空,则直接使*pphead=newnode,若此时我们的链表中已经有数据了,则我们需要通过循环来找到链表中的最后一个节点并将我们刚创建好的节点连接上去就可以了!及ptail->next=newnode;
尾插讲完了,接下来就是头插了。看下图:
其实当我们理解了尾插之后,理解其他插入方法就会变得很简单了,这里尾插与头插不一样的就是我们新创建的节点中的next指针要指向我们原来链表的第一个节点,及newnode->next=*pphead;同时我们也需要使*pphead指向newnode,因为我们需要*pphead(plist指针)一直指向链表的第一个节点!
第三个我们就来讲在指定位置之后插入数据了,看以下代码:
我们创建了SLInsertAfter函数,这里需要提的是它的参数pos,pos指向的是链表中某一个节点的地址,我们就是要在这个节点后插入数据,若是我们需要在某一个节点后插入数据,那么我们就需要先遍历链表找到那个节点的地址,然后将其作为参数传给函数就行了。由于比较简单,小编就不讲怎么寻找了;
插入讲完了之后我们就要讲删除了!
二、删除节点
1.尾删
如图:
尾删需要注意的是pphead和*pphead都不能为空,否则就没有数据给他删除,这里,当链表只有一个节点时,我们直接删除第一个节点就行了。当不止一个节点时,我们需要先创建两个指针prev和ptail,通过遍历链表来时ptail指向最后一个节点,prev则指向其前一个节点,然后我们再进行删除就行了,注意:这里prev的作用就是在删除后将最后一个节点的next指针指向为空!
2.头删
看下图:
头删就较为简单了,直接删除就行了,需要注意的是要将*pphead指向删除后的第一个节点的位置!
3.删除指定位置
看图:
删除指定节点也需要我们提前找到我们要删除的那个节点的地址,这里需要注意的是我们还需要定义一个指针prev使其指向pos位置的前一个位置,否则我们将无法链接pos位置的前后节点!
到这里,我们的单链表就讲完了!希望大家看完后能有所收获,若有不懂的可以提问哦,欢迎大家共同学习交流!
点个关注,防止迷路!后续小编还会更新更多关于C语言以及C++的知识,希望大家共同学习交流!
相关文章:
c语言专题之单链表的实现
在之前的博客中小编已经讲解了顺序表及其应用,所以在将讲单链表之前,我们先来重新思考一下顺序表,这里我先来讲顺序表的几个小缺点: 1.顺序表中在我们数据时,如头插、在指定位置插入等,我们通常需要整体挪动…...
Spring 源码学习(七)——注解后处理器
通过之前对注解式配置的解析(Spring 源码学习(三)—— 注解式配置解析_spring源码学习-CSDN博客)可以发现其使用 AnnotationConfigUtils 类的 registerAnnotationConfigProcessors 静态方法对象注解后处理器对象进行注册ÿ…...
GEE训练教程——基于 Sentinel-1 数据对 Felső-Kiskunság 湖区的可视化分析
目录 简介 代码解释 代码 结果 简介 GEE训练教程——基于 Sentinel-1 数据对 Felső-Kiskunsg 湖区的可视化分析 此处打开后运行后直接在script界面上就可以输入指定的年份和月份,但不是GEE APP的运算,是直接在弹出的框内输入即可。 代码解释 以下是您提供的 Google …...
docker 相关操作
1. 以下是一些常见的 Docker 命令: docker --version显示安装的 Docker 版本。 docker pull <image_name>从 Docker Hub 或其他镜像仓库下载镜像。 docker build -t <image_name> <path>从指定路径的 Dockerfile 构建 Docker 镜像。 docker i…...
【汽车】-- 燃油发动机3缸和4缸
3缸和4缸燃油发动机是小轿车常见的发动机配置。以下从结构特点、性能、经济性等方面对两者进行对比,并分析优缺点及使用注意事项: 1. 结构与运行原理 3缸发动机 特点:少一个气缸,内部零部件更少,整体结构更紧凑。优点…...
Python - 处理包含非utf-8 的字符编码
有这样的字符串,utf-8 编码中包含 ascii 编码内容 你好\x0a\x0a哈哈s 你好\x0a\x0a哈哈 b s.encode(utf-8) b.decode(utf-8)其它尝试 >>> b s.encode(utf-8) >>> b.decode(ascii) Traceback (most recent call last):File "<stdin&g…...
主坐标分析(PCoA)
主坐标分析(PCoA)是一种多变量统计方法,用于研究样本间的相似性或差异性,是一种非约束性的数据降维分析方法。以下是PCoA的关键点和实施步骤: 什么是PCoA? PCoA通过将样本距离矩阵转换为坐标,…...
Linux 网络接口配置
在 Linux 中,网络接口配置文件用于控制系统中的软件网络接口,并通过接口实现对网络设备的控制。当系统启动时,系统通过这些接口配置文件决定启动哪些接口,以及如此对这些接口进行配置. 在 Linux 中,网络接口配置文件用于控制系统中的软件网络接口,并通过这些接口实现对网络…...
Netty客户端接收不到服务端发送的数据问题
文章目录 前言问题描述相关代码解决方法 前言 环境 JDK:64位 jdk1.8.0_201 Netty:4.1.39.Final 问题描述 项目中使用Netty接受客户端的消息,客户端为硬件设备,在接受数据后发送数据到服务端。 同时因为客户端没有联网ÿ…...
基于多视角深度学习技术的乳腺X线分类:图神经网络与Transformer架构的研究|文献速递-生成式模型与transformer在医学影像中的应用速递
Title 题目 Mammography classification with multi-view deep learning techniques:Investigating graph and transformer-based architectures 基于多视角深度学习技术的乳腺X线分类:图神经网络与Transformer架构的研究 01 文献速递介绍 乳腺X线检查是乳腺癌…...
SCRM私域流量管理工具助力企业微信电商转型升级
内容概要 在当今数字化时代,SCRM(社交客户关系管理)私域流量管理工具正逐渐成为企业转型的重要助力。尤其是在电商领域,企业微信的兴起为许多公司打开了新的销售渠道,通过SCRM系统的高效整合,企业能够更加…...
PTA 输出三角形字符阵列
本题要求编写程序,输出n行由大写字母A开始构成的三角形字符阵列。 输入格式: 输入在一行中给出一个正整数n(1≤n<7)。 输出格式: 输出n行由大写字母A开始构成的三角形字符阵列。格式见输出样例,其中…...
纯血鸿蒙崛起,原生Android挑战?两大操作系统巅峰对决,智能设备未来谁主沉浮?
鸿蒙HarmonyOS和原生Android系统虽然在一些方面相似,但在架构、设计理念、API、开发工具等方面存在一些差异。鸿蒙系统的目标是跨设备、分布式的操作系统,强调多设备协同和资源共享,而Android则主要集中在智能手机和移动设备领域。 下面将从…...
书生实战营第四期-进阶岛第六关-MindSearch 快速部署
一、开发环境配置 1、打开codespace主页,选择Blank模板进行创建 Codespaces 2、创建conda环境隔离并安装依赖 conda create -n mindsearch python3.10 -y conda init 因为是新建的codespace,在第一次创建conda环境时,需要conda init 然后再…...
【Cadence32】PCB多层板电源、地平面层创建心得➕CM约束管理器Analyze分析显示设置➕“DP”报错DRC
【转载】Cadence Design Entry HDL 使用教程 【Cadence01】Cadence PCB Edit相对延迟与绝对延迟的显示问题 【Cadence02】Allegro引脚焊盘Pin设置为透明 【Cadence03】cadence不小心删掉钢网层怎么办? 【Cadence04】一般情况下Allegro PCB设计时的约束规则设置&a…...
华东理工大学2001年数据结构与程序设计试题
华东理工大学2001年数据结构与程序设计试题 一、单选题(10分) 1.若某线性表中最常用的操作是在最后一个元素之后插入一个元素和删除第一个元素,则采用——存储方式最节省运算时间。 A.单链表 B.仅有头指针的单循环链表 Cÿ…...
WebRTC 的核心:RTCPeerConnection
WebRTC 的核心:RTCPeerConnection WebRTC 的核心:RTCPeerConnection 创建 RTCPeerConnection 对象RTCPeerConnection 与本地音视频数据绑定媒体协商ICE 什么是 Candidate?收集 Candidate交换 Candidate尝试连接 SDP 与 Candidate 消息的互换…...
Spring Boot 中 WebClient 的实践详解
在现代微服务架构中,服务之间的通信至关重要。Spring Boot 提供了 WebClient,作为 RestTemplate 的替代方案,用于执行非阻塞式的 HTTP 请求。本文将详细讲解 WebClient 的实践,包括配置、使用场景以及常见的优化策略,帮…...
OceanBase 社区版 4.0 离线方式升级bp1至bp2 指南(含避坑总结)
注:目前社区版对 4.0 升级 bp1至 bp2也未有完善的文档,本次升级中也是遇到不少坑,写本文也希望对OB感兴趣的可以尝试少些遇坑。 也希望对升级有更好方式建议方式的朋友一起切磋交流,以便再进一步完善升级方案。 第一次做OB的升级&…...
@ControllerAdvice 的实现原理
从源码角度分析 Spring Boot 中 ControllerAdvice 的实现原理 在 Spring Boot 开发中,ControllerAdvice 是一个非常强大的特性,允许开发者集中处理控制器中的异常、全局数据绑定和模型属性。本文将从源码的角度探讨 ControllerAdvice 的实现原理&#x…...
将当前cad图中实体复制到另一个新的dwg的块中,并插入块——CAD c#实现
本案例为:将当前cad图中实体复制到另一个cad的块中,并插入块。 目前代码尚未调试成功,找bug中...... public class Demo {[CommandMethod("xx1")]public void XXA(){// 获取当前文档和数据库Document currentDoc Application.Doc…...
MongoDB-ObjectID 生成器
前言 MongoDB中一个非常关键的概念就是 ObjectID,它是 MongoDB 中每个文档的默认唯一标识符。了解 ObjectID 的生成机制不仅有助于开发人员优化数据库性能,还能帮助更好地理解 MongoDB 的设计理念。 什么是 MongoDB ObjectID? 在 MongoDB …...
解决Vue项目打包后dist中的index.html用浏览器直接打开显示空白页或者page not found的问题
前言 默认情况下,使用 npm run build 打包后的 index.html 无法直接访问,需要nginx转发或使用node启用简单http serve等方式实现。 实际开发中,有时需临时打开前端项目,若可以直接打开打包后的文件,对某些场景下他人简…...
爬虫基础之Session和Cookie
在浏览网站的过程中,我们经常会遇到需要登录的情况,有些页面只有登录之后才可以访问。在登录之后可以连续访问很多次网站,但是有时候过一段时间就需要重新登录。还有一些网站,在打开浏览器时就自动登录了,而且在很长时间内都不会失…...
计算机毕业设计PyFlink+Hadoop广告推荐系统 广告预测 广告数据分析可视化 广告爬虫 大数据毕业设计 Spark Hive 深度学习 机器学
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
排序算法(2):选择排序
问题 排序 [30, 24, 5, 58, 18, 36, 12, 42, 39] 选择排序 选择排序每次从待排序序列中选出最小(或最大)的元素,将其放到序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(或最大)元素…...
uni-app(HBuilderX)搭建小程序流程(请求封装,下拉刷新,底部加载等)
uni-app 是一个跨平台的前端框架,用于开发多端应用。uni-app 提供了一个统一的 API,允许开发者编写一次代码,最终部署到多个平台,极大地提高了开发效率。在编写小程序的时候和原生微信开发者工具语法略有区别。 目录 一、请求工具…...
【Super Tilemap Editor使用详解】(一):创建图块集
1、在场景中创建瓦片地图之前,我们需要先创建一个图块集供地图使用。 可以在“Project”面板中创建: 也可以在Assets“” 菜单中创建: 2、创建成功之后,“Atlas Texture”是空的,我们需要选择一个图集。 3、选中插件中…...
驱动---1.DAC8552实现三角波输出
最近开始进行新项目的研发,考虑用DAC做一个前级输出,选择了DAC8552这个器件的一个模块,用了野火的指南者做主控,芯片是STM32F103VET6,主频是72MHz。 一、器件手册重要信息提取 1.DAC8552具有十六位的分辨率、双通道输…...
PHP中GD库的使用
由于我要用到php的验证码 <?php session_start();// 生成验证码 $random_code substr(md5(uniqid(mt_rand(), true)), 0, 6);// 将验证码保存到 session 中 $_SESSION[captcha] $random_code;// 创建图片 $font 6; $image_width 100; $image_height 40;// 创建图像 $…...
【ChArUco Marker】标定板检测
目录 1.ChArUco介绍2.源码分析(opencv 4.5.4)3.ChAruco板创建(opencv 4.5.4)4.Charuco板检测(opencv 4.5.4)ChArUco检测源码(不使用标定参数) 5.ChArUco姿态估计(opencv …...
Kafka | RabbitMQ | RocketMQ | ActiveMQ 的区别和入门案例
springboot,vue,springcloudalibaba课程视频,有需要可以看看 <!-- springboot,springboot整合redis,整合rocketmq视频: --> https://www.bilibili.com/video/BV1nkmRYSErk/?vd_source14d27ec13a473…...
TensorBoard
1、TensorFlow的TensorBoard TensorBoard是TensorFlow的一个组件,它提供了一个交互式的界面,用于可视化TensorFlow程序的训练过程和模型结构。 使用TensorBoard,你可以: 可视化训练过程中的各种指标,如损失函数、准…...
C# 中的异步编程:提升应用程序响应性和性能
C#中的异步编程(Asynchronous Programming)。异步编程是现代应用程序开发中非常重要的一个方面,它允许程序在等待长时间运行的操作(如I/O操作、网络请求等)时继续执行其他任务,从而提高应用程序的响应性和性…...
前端框架 React 与 Vue3对比 —— 技术选型
在进行前端框架React与Vue3的技术选型对比时,我们可以从以下几个方面进行综合考虑: 1. 性能比较 • Vue3 通过 Vite 打包工具实现了快速的开发和构建,同时使用了响应式系统和 Proxy 技术来提高数据响应速度。在大部分测试用例中,…...
虚拟机与Xshell5和Xftp4连接与虚拟机克隆
虚拟机与Xshell5和Xftp4连接与虚拟机克隆 虚拟机与Xshell5和Xftp4连接 虚拟机与Xshell5连接 下载Xshell5后启动出现如下界面,点击新建 新建会话输入虚拟机命名,如master,主机输入虚拟机IP,xxx.xxx.xxx.xxx然后确认,…...
华为USG系列防火墙 RESTCONF NAT配置 Python实现
目录 前言 文档下载 开启RESTCONF接口 Python 实现SNAT增删改查 查看nat映射列表 查看私网地址池 查看源地址池(公网) 查看nat映射规则 创建nat映射规则 创建私网地址池 创建源地址池 创建nat映射规则 修改NAT映射规则 删除NAT映射规则 …...
qemu安装arm64架构银河麒麟
qemu虚拟化软件,可以在一个平台上模拟另一个硬件平台,可以支持多种处理器架构。 一、安装 安装教程:https://blog.csdn.net/qq_36035382/article/details/125308044 下载链接:https://qemu.weilnetz.de/w64/2024/ 我下载的是 …...
深入解析 Spring 框架:核心特性与应用价值
1.什么是spring? Spring 是一个开源的 Java 应用框架,由 Pivotal Software 提供支持。它为开发基于 Java 的企业级应用提供了一整套基础设施支持。Spring 框架的核心功能是依赖注入(Dependency Injection, DI),它帮助开发者实现…...
protobuf 报文编解码工具
QT实现的 protobuf 反序列化 & 序列化工具,版本号V1.2 下载链接:protobuf报文编解码工具资源-CSDN文库 源码github:ProtobufTool 使用说明: 1. 点击“加载proto文件”按钮,从本地选择 .proto文件 2. 选择消息名称ÿ…...
Milvus向量数据库06-RAG检索增强
Milvus向量数据库06-RAG检索增强 文章目录 Milvus向量数据库06-RAG检索增强1-学习目标2-参考网址3-执行过程记录1-到底什么是RAGRAG 的基本流程:为什么 RAG 优于传统的基于检索的方法:示例流程: 2-RAG和Elasticsearch对比3-RAG和向量数据库之…...
Unity3D下采集camera场景并推送RTMP服务实现毫秒级延迟直播
技术背景 好多开发者,希望我们能够分享下如何实现Unity下的camera场景采集并推送rtmp服务,然后低延迟播放出来。简单来说,在Unity 中实现采集 Camera 场景并推送RTMP的话,先是获取 Camera 场景数据,通过创建 RenderTe…...
标记数据集生成模型助力无数据情况下的大模型指令微调
在构建大模型应用时,通常有两种方式来改进效果,一种是构建外部知识库,利用RAG来完成。但RAG并不是万能的,对于特定领域的LLM应用,以及无需示例,就能完成特定任务等场合就需要进行微调。然而,微调…...
第六届地博会世界酒中国菜助力广州龙美地标美食公司推动地标发展
第六届知交会暨地博会:世界酒中国菜助力广州龙美地标美食公司推动地标产品创新发展 2024年12月9日至11日,第六届粤港澳大湾区知识产权交易博览会暨国际地理标志产品交易博览会在中新广州知识城盛大启幕。本届盛会吸引了全球众多知识产权领域的专业人士和…...
vue响应式原理
对于响应式原理,我们先了解vue是一个MVVM结构的框架;也就是数据层、视图层、数据-视图层;响应式的原理就是实现当数据更新时,视图层也要相应的更新,基于响应式原理我们可以使数据驱动视图的实现变得简单而高效 一、响…...
SwiftUI 列表(或 Form)子项中的 Picker 引起导航无法跳转的原因及解决
概述 在 SwiftUI 的界面布局中,列表(List)和 Form 是我们秃头码农们司空见惯的选择。不过大家是否知道:如果将 Picker 之类的视图嵌入到列表或 Form 的子项中会导致导航操作无法被触发。 从上图可以看到:当在 List 的…...
使用Allure作为测试报告生成器(Java+Selenium)
背景 JAVA项目中原先用Jenkinsseleniumselenium grid来日常测试UI并记录。 问题 当某一个testSuite失败时,当需要确认UI regression issue还是selenium test case自身的问题,需要去jenkins中查log,一般得到的是“Can not find element xxx…...
【论文阅读】处理器芯片敏捷设计方法:问题与挑战
作者:包云岗老师 包云岗老师是计算机体系结构方向的大牛,推动了体系结构方面的开源事业! 欢迎对本栏目感兴趣的人学习"一生一芯"~ 学习体会: 已有的软硬件生态系统和开发成本制约了对新结构的探索。但目前仍在几种路线上做尝试~ 1…...
系统内核自动处理 TCP 连接(自动发送 RST 数据包来重置连接)
使用原始套接字发送了一个 SYN 数据包后,对方发送了 SYN,ACK 数据包,但系统仍然会自动发送 RST 数据包。这通常是因为操作系统内核在处理 TCP 连接时的行为。 原因分析 内核处理 TCP 连接: 即使你使用了原始套接字来发送和接收数据包&#x…...
VLDB 2024 | 时空数据(Spatial-temporal)论文总结
VLDB 2024于2024年8月26号-8月30号在中国广州举行。 本文总结了VLDB 2024有关时空数据(time series data)的相关论文,主要包含如有疏漏,欢迎大家补充。 🌟【紧跟前沿】“时空探索之旅”与你一起探索时空奥秘…...