单链表(配图详解每一个函数接口)(下)

简介: 单链表(配图详解每一个函数接口)(下)

6.头删函数的实现:SListNodePopFront


对于头删函数我们也是先考虑普通情况,在考虑特殊情况:


情况1:链表里本身有很多元素,我们进行头删:


55c2b1829e12484eabde4886eefcffaa.png


情况2: 只有一个节点的情况也是包含于情况1的,完全是没问题的;接下来再看一下空链表;空链表就不需要头删,直接return就可以。

下面看具体代码:


8832fff4d7c0460cbddcc106c2c546b7.png


我们头删一个数据测试结果:


image.png

7.修改函数的实现:SListNodeModeify

查找函数的实现:SListNodeFind


这里我们要明确一点,无论是修改、任意位置插入、任意位置删除,都是需要查找函数SListNodeFind,因为它不像顺序表那样可以直接给出下标去插入、删除。这里必须根据数据去搜索,返回地址,根据地址进行任意插入和删除。既然这样,我们不如封装一个查找函数,并且对于查找函数我们也可以用传值调用,因为它并不需要改变数据;但是这里为了保持统一,我用的都是传址调用。


下面看具体代码:


image.png



有了查找函数,我们就可以根据查找返回的pos地址来修改数据了,具体代码如下:

image.png

我们不妨就把数据2改成数据200,测试结果:

image.png


8.任意位置插入函数的实现:SListNodeInsert


对于任意位置插入,我们也还是要先调用查找函数SListNodeFind;然后调用SListNodeCreat进行动态开辟空间。我们根据查找函数SListNodeFind返回的pos地址,在pos地址进行插入操作,具体如下:


情况1:我们还是先考虑普通情况,特殊情况单独拿出来讨论;首先我们肯定要得到pos的前一个位置prev,然后prev->next = newnode,然后newnode->next = pos就可以啦:

599beca38cee407b9c7363e260d073c2.png



情况2:如果是在第一个节点之前插入呢?它同样是没有pos的前一个节点prev,此时怎么办呢?最简单的办法当然是调用头插函数SListNodePushFront啦!当然我们可以去验证在最后一个节点tail前插入也是没问题的;至于空链表的情况,我们会给出限制条件;根本不会让它调用SListNodeInsert函数:


d9c4345f658d4618830294d9db58f805.png




具体代码如下:

ad5887afd71245e597d371c4142f16b7.png

我们不妨在1前面插入100,测试一下:


6474a66242e54b659e6c31d5f9e8c0f3.png

9.任意位置删除函数的实现:SListNodeDelete

同样的思路,我们先考虑普通情况,在分析特殊情况:


情况1:我们既然要删除pos位置,就要知道pos的前一个位置prev,这样才能使prev->next = pos->next;中间跳过pos,具体逻辑图如下:


faca345dd3c34ada89e432dd84c3cbad.png


情况2:问题又来了,如果还是在pos = *pphead位置删除呢?这样pos又没有前一个地址prev,怎么办呢?最简单的方法还是调用以前的函数,这里调用头删函数SListNodePopFront,具体逻辑图如下:

1c68f5370772444f81a6e98286817405.png



具体代码如下:

f1402605064e4bf4a2941cfb07a79e2d.png



我们删除数据3并测试一下结果:

9402c7f4973548c98e0ec3f22180ea67.png


10.求大小函数的实现:SListNodeSize


对于求大小很简单,我们定义一个计数器count就行,这里就不再多数,直接上代码。

具体代码如下:


6d0787b3f87f409d8698bd759b95383c.png


11.销毁函数的实现:SListNodeDestory


链表的销毁和顺序表不同,顺序表是连续的空间,free一次就可以;而链表创建的空间是不连续的,我们malloc多少次,就需要free多少次,下面看具体代码:

具体代码如下:

3bad4978ca6d4ee8b90a937b4aeddd18.png


所有具体代码:


c500300e935d4775ad6162ba3a788152.png

总结:对于链表的操作,我的建议是一定要画图分析,特别是接下来的双链表;另外就是我们在写各种各样的函数接口,可以先考虑最普通的情况,把特殊的情况单独拿出来进行分析!!!这里我通过画图和文字分析的形式把基本上所有接口都分析了一遍,希望对各位有所帮助;感兴趣的同学也可以写成项目工程的格式!!!


如果对各位有所帮助,请点赞支持一波,万分感谢!!!


结束语


今天的分享就到这里,想要提升编程思维的,快快去注册牛客网开始刷题吧!各种大厂面试真题在等你哦!

184068dc41e94efbb14e555f972eaa17.png

相关文章
|
6月前
|
消息中间件 算法 调度
数据结构与算法——单向循环列表、栈和队列(附代码)
数据结构与算法——单向循环列表、栈和队列(附代码)
42 2
|
11月前
|
存储 Java C++
数据结构单链表之C 中的通用链表 | 第十六套
数据结构单链表之C 中的通用链表 | 第十六套
54 1
|
6月前
|
存储 算法
【数据结构-零基础学习】线索二叉树(代码+图示+解析)
【数据结构-零基础学习】线索二叉树(代码+图示+解析)
284 0
|
11月前
|
算法
数据结构单链表之以给定大小的组反转链表 | 第十二套
数据结构单链表之以给定大小的组反转链表 | 第十二套
35 0
|
11月前
|
存储 算法
数据结构单链表之检测和删除链表中的循环 | 第十三套
数据结构单链表之检测和删除链表中的循环 | 第十三套
50 0
|
存储
【数据结构】顺序表和链表重点知识汇总(附有代码)
【数据结构】顺序表和链表重点知识汇总(附有代码)
|
存储 Linux C语言
C语言函数和指针的关系之三(完结)
C语言函数和指针的关系之三(完结)
54 0
|
Java 索引 Python
Python 触“类”旁通3|单链表基本操作之找查、删除和反转
Python 触“类”旁通3|单链表基本操作之找查、删除和反转
113 0
|
存储 算法
【基础篇】5 # 链表(下):写好链表代码的六个实用技巧
【基础篇】5 # 链表(下):写好链表代码的六个实用技巧
94 0
【基础篇】5 # 链表(下):写好链表代码的六个实用技巧