一些关于单链表的操作
思维导图:
一, 链表
1.1节点的结构
链表是啥样的啊?顾名思义链表就是一种用链子链接起来的表。那这种表是怎么样的啊?
这样的呗:
现在,我们知道了链表的形状了。那我们该如何用编程语言来形成这一种形状呢?
首先,一个链表节点是这样的:
毫无疑问,链表也需要存储一些数据(不然要链表来干嘛?)。而且链表还有一条尾巴(当然这是为了形象而画出来的)这条尾巴又要如何形成呢?现在让我们来想一想尾巴的作用是什么啊?当然是为了找到下一个节点啊,那我们要找到下一个节点的话我们应该用什么去找呢?当然是下一个节点的地址啊!那放地址我们是不是应该要用指针啊?那好,现在我们已经清楚的知道了这一个节点的结构组成了。画图如下:
现在,我们再往下推。首先,我们这一个结构里面含有两种不同类型的数据。不同类型的数据应该用什么数据结构来存储呢?明显是结构体。那我的指针指向的下一个节点是不是又是一个结构体或者空指针呢?那这个指针是不是又可以定义为结构体指针呢?答案是肯定的!
经过以上分析,现在我们就可以把代码写出来了:
代码:
typedef int SLTDateType;
typedef struct SListNode
{SLTDateType data;struct SListNode* next;
}SListNode;//这里的typedef是为了在后面对这个结构体更好的使用
1.2节点的生成
现在我们已经把节点的结构搞明白了,我们就要进入第二阶段了。我们要把上面的结构的节点生成一下。生成节点用什么啊?malloc啊!
生成节点代码:
SListNode* BuySListNode(SLTDateType x)
{SListNode* newnode = (SListNode*)malloc(sizeof(SListNode));//动态开辟空间if (newnode == NULL) {printf("malloc fail\n");return NULL;}newnode->data = x;//在数据区内放入数据newnode->next = NULL;//先置空指针区return newnode;//将新节点返回
}
1.3打印链表
打印链表该怎么做呢?
其实很简单,这样做就行了!
代码:
void SListPrint(SListNode* plist) {SListNode* cur = plist;while (cur) {printf("%d->", cur->data);cur = cur->next;}printf("->NULL\n");//当链表为空的时候就打印一个NULL来提示一下
}
1.4在链表中插入数据
现在我们的链表的设计已经写好了,但是这个链表是一个空链表。现在我们就要来给这个链表插入数据。当然,插入数据的方法有很多种。像头插,尾插,中间插入等等……。现在我们就来一 一实现一下。
1.4.1:头插
头插的方法就是生成一个新的节点,然后让新的节点成为新的头节点连接*pplist。然后再移动*pplist的位置让它指向新的节点。
void SListPushFront(SListNode** pplist, SLTDateType x) {SListNode* newhead = BuySListNode(x);newhead->next = *pplist;*pplist = newhead;
}
其实,这里的头插逻辑基本上没有什么难度。但是这里使用一级指针还是二级指针才是需要花时间去理解的!可以看到我们这里使用的是二级指针,为什么呢?一句话——“你要改变谁就要用谁的指针”。因为在test文件里面我用的是结构体的指针:
SListNode* plist = NULL;
所以我要改变外面的plist的话就要用plist的指针了,因为指针的指针就是二级指针!所以我这里就用了二级指针!!!(解答完毕)
1.4.2:中间插入
先来讲一下我的中间插入的逻辑:我的插入是在我要找到的数据的后一个位置插入,所以找到位置很重要所以我会写一个查找数据位置的函数
代码;
SListNode* SListFind(SListNode* plist, SLTDateType x) {assert(plist);SListNode* pos = plist;while (pos) {if (pos->data == x) {return pos;//找到了就返回,结束循环}pos = pos->next;}printf("你要找的值不存在\n");return NULL;//找不到就返回空
}
写完了寻找节点的函数以后,我们就可以来写一个中间插入的函数来。代码如下:
void SListInsertAfter(SListNode* pos, SLTDateType x)
{assert(pos);//要对pos断言一下,因为这是中间插入,链表中有节点才能中间插入!SListNode* newnode = BuySListNode(x);SListNode* next = pos->next;//记录一下pos指向的下一个节点,因为pos->next要被改变!pos->next = newnode;newnode->next = next;}
1.4.3尾插
尾插?啥是尾插啊?顾名思义,尾插便是找到链表的尾巴然后再来插入,具体的逻辑可以参见代码。
void SListPushBack(SListNode** pplist, SLTDateType x)
{SListNode* newtail = BuySListNode(x);SListNode* tail = *pplist;if (tail == NULL) {//如果链表为空那就直接让*pplist指向newtail*pplist = newtail;}else {while (tail->next) {//这里找的是尾节点,所以当tail->next为空时就找到了尾节点了tail = tail->next;}tail->next = newtail;}
}
1.5在链表中删除节点
和链表的插入一样,链表节点的删除也有三种。分别是头删,尾删,中间删除!
1.5.1:头删
头删,顾名思义便是删除头节点。思路很简单,就是调整一下plist的指向让plist指向下一个节点然后释放上一个节点就可以了。
代码:
void SListPopFront(SListNode** pplist) {assert(pplist);//pplist不可能为空,所以这里要预防一下assert(*pplist);//空链表不能删SListNode* del = *pplist;*pplist = (*pplist) ->next;free(del);del = NULL;
}
1.5.2:中间删除
这个操作的实现也是需要和 SListFind搭配使用的,前面我已经将 SListFind写好了。这里我就不再写了,我在这里直接写中间删除的函数就好了。当然这个中间删除函数与前面的中间插入一样,都只是删除中间的节点而不会删除头节点与尾节点。所以依照这个思路,我们便可以将代码写出来:
代码:
void SListEraseAfter(SListNode* pos) {assert(pos);//中间删除不会删除头节点,更不会删除不存在的值。assert(pos->next);//也不能删除空指针SListNode* del = pos->next;pos->next = del->next;free(del);del = NULL;
}
1.5.3尾删
顾名思义,尾删就是把链表的尾节点删除掉。删除的逻辑就是找到链表的尾节点的前面一个节点然后将这一个节点中的指向改为空。并把尾节点给释放掉。
代码:
void SListPopBack(SListNode** pplist) {assert(pplist);//指针的地址不可能为NULLassert(*pplist);//空链表不能尾删if ((*pplist)->next == NULL) {free(*pplist);*pplist = NULL;}else {SListNode* tail = *pplist;while (tail->next->next) {tail = tail->next;}SListNode* del = tail->next;tail->next = NULL;free(del);del = NULL;}
}
1.6销毁链表
因为我们的链表是malloc出来的一块一块的空间,所以当我们的链表用完以后就要对这些一块一块的空间进行释放。说所以我们又要写一个函数来销毁链表。
代码:
void SListDestroy(SListNode** pplist) {assert(pplist);assert(*pplist);//链表未创建不能销毁SListNode* cur = NULL;while (*pplist) {cur = (*pplist)->next;free(*pplist);*pplist = cur;}*pplist = NULL;printf("链表销毁成功!\n");
}
总结:
到这里我们就已经把我能讲的一些关于链表的知识,我所知道的关于链表的知识给讲完了。但是我还是想要总结一下:
1.在我们要操作链表时,比如想要增删时就要用二级指针。
2.当一个变量不可能为空指针时要对它进行assert断言。
3.当一个变量为空时会导致错误时也要对这个变量进行assert断言。
好了,总结完毕!
相关文章:
一些关于单链表的操作
思维导图: 一, 链表 1.1节点的结构 链表是啥样的啊?顾名思义链表就是一种用链子链接起来的表。那这种表是怎么样的啊? 这样的呗: 现在,我们知道了链表的形状了。那我们该如何用编程语言来形成这一种形状…...
CTF-PHP反序列化漏洞2-利用魔法函数
作者:Eason_LYC 悲观者预言失败,十言九中。 乐观者创造奇迹,一次即可。 一个人的价值,在于他所拥有的。可以不学无术,但不能一无所有! 技术领域:WEB安全、网络攻防 关注WEB安全、网络攻防。我的…...
Doris(23):Doris的函数—字符串函数
1 append_trailing_char_if_absent(VARCHAR str, VARCHAR trailing_char) 如果s字符串非空并且末尾不包含c字符,则将c字符附加到末尾。 trailing_char只包含一个字符,如果包含多个字符,将返回NULL select append_trailing_char_if_absent(a,c);select append_trailing_cha…...
01-Shiro550漏洞流程
1. 漏洞原理 Apache Shiro框架提供了记住密码的功能(RememberMe),用户登录成功后会生成经过加密并编码的cookie。在服务端对rememberMe的cookie值,先base64解码然后AES解密再反序列化,就导致了反序列化RCE漏洞。 那么…...
《程序员面试金典(第6版)》面试题 16.08. 整数的英语表示
题目描述 给定一个整数,打印该整数的英文描述。 示例 1: 输入: 123输出: “One Hundred Twenty Three” 示例 2: 输入: 12345输出: “Twelve Thousand Three Hundred Forty Five” 示例 3: 输入: 1234567输出: “One Million Two Hundred Thirty Four Thousand…...
ChatGPT技术原理 第四章:Transformer模型
目录 4.1 什么是Transformer 4.2 Transformer结构详解 4.3 Self-Attention机制 4.4 Multi-Head Attention机制 4.1 什么是Transformer...
基于redis和threadlocal实现登录状态校验和拦截
1.流程图 单机节点下的登录状态校验 分布式节点下的登录状态校验 2.代码实现 实现步骤分为如下几步 实现WebMvcConfigurer接口,添加拦截器定义拦截器,需要配置两个interceptor,第一个用于刷新token,写threadlocalÿ…...
14-6-进程间通信-信号量
前面学习了pipe,fifo,共享内存,信号。 本章将讲述信号量。 一、什么是信号量/信号量集? 1.什么是信号量 信号量是一个计数器。信号量用于实现进程间的同步和互斥。而可以取多个正整数的信号量被称为通用信号量。 对信号量的使用场景的解读 房间&#…...
《中国教育报》投稿邮箱编辑部征稿
《中国教育报》国家教育部主管,中国教育报刊社主办的以教育新闻为主的全国性日报。是迄今为止中国最具权威和最有影响力的教育新闻媒体。中国教育报刊社是中华人民共和国教育部直属的新闻出版机构。2018年获得第三届全国“百强报纸”。2019年入选“新媒体影响力指数…...
Photoshop如何使用绘画和图像修饰之实例演示?
文章目录 0.引言1.给图像添加渐变色效果2.快速创建一副素描画3.清除图像中多余的景物4.快速融合两张图像5.调整图像光影6.人像面部瑕疵修除7.美化眼睛 0.引言 因科研等多场景需要进行绘图处理,笔者对PS进行了学习,本文通过《Photoshop2021入门教程》及其…...
【C++】布隆过滤器
文章目录 布隆过滤器提出布隆过滤器概念布隆过滤器应用场景设计思路:布隆过滤器的插入布隆过滤器的查找布隆过滤器删除BloomFilter.h布隆过滤器优点布隆过滤器缺陷 布隆过滤器提出 我们在使用新闻客户端看新闻时,它会给我们不停地推荐新的内容,它每次推荐时要去重,去掉那些已经…...
功能齐全的 ESP32 智能手表,具有多个表盘、心率传感器硬件设计
相关设计资料下载ESP32 智能手表带心率、指南针设计资料(包含Arduino源码+原理图+Gerber+3D文件).zip 介绍 我们调查了智能手表项目的不同方面,并学会了集成和测试每个单独的部分。在本文中,我们将使用所学知识,结合使用硬件和软件组件,从头开始创建我们自己的智能手表。在…...
微服务不是本地部署的最佳选择,不妨试试模块化单体
微服务仅适用于成熟产品 关于从头开始使用微服务,马丁・福勒(Martin Fowler)总结道: 1. 几乎所有成功的微服务都是从一个过于庞大而不得不拆分的单体应用开始的。 2. 几乎所有从头开始以微服务构建的系统,最后都会因…...
解读Toolformer
【引子】读论文Toolformer: Language Models Can Teach Themselves to Use Tools,https://arxiv.org/pdf/2302.04761.pdf,再阅读了几篇关于Toolformer的网络热文,于是“无知者无畏”,开始自不量力地试图解读Toolformer。 大语言模…...
FCOS3D Fully Convolutional One-Stage Monocular 3D Object Detection 论文学习
论文地址:Fully Convolutional One-Stage Monocular 3D Object Detection Github地址:Fully Convolutional One-Stage Monocular 3D Object Detection 1. 解决了什么问题? 单目 3D 目标检测由于成本很低,对于自动驾驶任务非常重…...
Xpath学习笔记
Xpath原理:先将HTML文档转为XML文档,再用xpath查找HTML节点或元素 什么是xml? 1、xml指可扩展标记语言 2、xml是一种标记原因,类似于html 3、xml的设计宗旨是传输数据,而非显示数据 4、xml标签需要我们自己自定义 5、x…...
网络编程之 Socket 套接字(使用数据报套接字和流套接字分别实现一个小程序(附源码))
文章目录 1. 什么是网络编程2. 网络编程中的基本概念1)发送端和接收端2)请求和响应3)客户端和服务端4)常见的客户端服务端模型 3. Socket 套接字1)Socket 的分类2)Java 数据报套接字通信模型3)J…...
What Are Docker Image Layers?
Docker images consist of multiple layers that collectively provide the content you see in your containers. But what actually is a layer, and how does it differ from a complete image? In this article you’ll learn how to distinguish these two concepts and…...
范数详解-torch.linalg.norm计算实例
文章目录 二范数F范数核范数无穷范数L1范数L2范数 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 范数是一种数学概念,可以将向量或矩阵映射到非负实数上,通常被…...
postgresdb备份脚本
以下是一个简单的postgresdb备份脚本示例: 复制 #!/bin/bash # 设置备份目录和文件名 BACKUP_DIR/path/to/backup BACKUP_FILEdb_backup_$(date %F_%H-%M-%S).sql # 设置数据库连接参数 DB_HOSTlocalhost DB_PORT5432 DB_NAMEmydatabase DB_USERmyusername DB_PA…...
MATLAB程序员投简历的技巧解析,如何写出有亮点的简历
如果你想在简历中展示你的项目经验,一定要有亮点。一个导出的 Excel 文件过大导致浏览器卡顿的例子就是一个很好的亮点。你可以在简历中写明这个例子。如果面试官问起,可以用浏览器的原理来解释。浏览器内核可以简单地分为以下 5 个线程:GUI …...
颜色空间转换RGB-YCbCr
颜色空间 颜色空间(Color Space)是描述颜色的一种方式,它是一个由数学模型表示的三维空间,通常用于将数字表示的颜色转换成可见的颜色。颜色空间的不同取决于所选的坐标轴和原点,以及用于表示颜色的色彩模型。在计算机…...
年薪40万程序员辞职炒股,把一年工资亏光了,得了抑郁症,太惨了
年薪40万的程序员辞职全职炒股 把一年的工资亏光了 得了抑郁症 刚才在网上看了一篇文章 是一位北京的一位在互联网 大厂上班的程序员 在去年就是股市行情比较好的时候 他买了30多万股票 结果连续三个月都赚钱 然后呢 他是就把每天就996这种工作就辞掉了 然后在家全是炒股 感觉炒…...
10分钟如何轻松掌握JMeter使用方法?
目录 引言 安装jmeter HTTP信息头管理器 JMeter断言 HTTP请求默认值来代替所有的域名与端口 JSON提取器来替换变量 结语 引言 想要了解网站或应用程序的性能极限,JMeter是一个不可或缺的工具。但是,对于初学者来说,该如何上手使用JMe…...
[NLP]如何训练自己的大型语言模型
简介 大型语言模型,如OpenAI的GPT-4或Google的PaLM,已经席卷了人工智能领域。然而,大多数公司目前没有能力训练这些模型,并且完全依赖于只有少数几家大型科技公司提供技术支持。 在Replit,我们投入了大量资源来建立从…...
LeetCode1047. 删除字符串中的所有相邻重复项
1047. 删除字符串中的所有相邻重复项 给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。 在 S 上反复执行重复项删除操作,直到无法继续删除。 在完成所有重复项删除操作后返回最终的字符串。答案保证唯一…...
3。数据结构(3)
嵌入式软件开发第三部分,各类常用的数据结构及扩展,良好的数据结构选择是保证程序稳定运行的关键,(1)部分包括数组,链表,栈,队列。(2)部分包括树,…...
QT停靠窗口QDockWidget类
QT停靠窗口QDockWidget类 QDockWidget类简介函数和方法讲解 QDockWidget类简介 QDockWidget 类提供了一个部件,它可以停靠在 QMainWindow 内或作为桌面上的顶级窗口浮动。 QDockWidget 提供了停靠窗口部件的概念,也称为工具面板或实用程序窗口。 停靠窗…...
【LeetCode】139. 单词拆分
139. 单词拆分(中等) 思路 首先将大问题分解成小问题: 前 i 个字符的子串,能否分解成单词;剩余子串,是否为单个单词; 动态规划的四个步骤: 确定 dp 数组以及下标的含义 dp[i] 表示 s…...
【三维重建】NeRF原理+代码讲解
文章目录 一、技术原理1.概览2.基于神经辐射场(Neural Radiance Field)的体素渲染算法3.体素渲染算法4.位置信息编码(Positional encoding)5.多层级体素采样 二、代码讲解1.数据读入2.创建nerf1.计算焦距focal与其他设置2.get_emb…...
福州做网站/如何把网站推广
今年蓝港卖版权卖了近7000[来源:GameRes.com]万人民币(官方称1000多万美金),年收入不到2亿人民币。也就是说1.3亿是国内运营收入,一半是西游记,也就是说6500万是西游记,平均每月西游记也就500多…...
wordpress 中文付费主题/seo网页推广
cellfun函数 n A{Hello, MATLAB, I love MATLAB, MATLAB is powerful, MATLAB is the language of technical computer} ;试统计A中每个元胞......函数语法为: Bcellfun(fun,A) ; fun 表示实现运算的 匿名函数或函数句柄,A是被实施运算的元胞数组。cellfun函数更详 细的使用说明…...
wordpress 4.4.2 中文/网站关键词排名外包
视频简介:该视频介绍emWin底层驱动接口。 源视频包下载地址:链接:http://pan.baidu.com/s/1nvPpC2d 密码:cbb7银杏科技优酷视频发布区:http://i.youku.com/gingko8...
郑州营销型网站推广工具/google搜索引擎入口 镜像
python文件和目录的操作python中,变量、序列和对象中存储的数据是暂时的,程序结束后就会丢失,为了能够长时间地保存程序中的数据,需要将程序中的数据保存到磁盘文件中,python提供了内置的文件和对象和文件、目录进行操…...
网站开发知识体系/seo推广专员招聘
踩着椭圆的轨迹,绕着我的心在转,这个时候发觉得,在三万六千公里的高度仰望星空和地面上是一样的。星星在闪,我在转圈,迷失的迭荡,惆怅的弧度。 牛顿的万有引力也计可以描述我和你的关系,开普勒三…...
dw做六个页面的网站/今日头条新闻大事
转自:http://blog.csdn.net/totogo2010/article/details/9100767 准备2个文件: 文件一,ThisService.app文件二,Doxygen.rb下载上述2个文件:ThisService&Doxygen_rb准备好之后,两步配置,一步…...