6.头删函数的实现:SListNodePopFront
对于头删函数我们也是先考虑普通情况,在考虑特殊情况:
情况1:链表里本身有很多元素,我们进行头删:
情况2: 只有一个节点的情况也是包含于情况1的,完全是没问题的;接下来再看一下空链表;空链表就不需要头删,直接return就可以。
下面看具体代码:
我们头删一个数据测试结果:
7.修改函数的实现:SListNodeModeify
查找函数的实现:SListNodeFind
这里我们要明确一点,无论是修改、任意位置插入、任意位置删除,都是需要查找函数SListNodeFind,因为它不像顺序表那样可以直接给出下标去插入、删除。这里必须根据数据去搜索,返回地址,根据地址进行任意插入和删除。既然这样,我们不如封装一个查找函数,并且对于查找函数我们也可以用传值调用,因为它并不需要改变数据;但是这里为了保持统一,我用的都是传址调用。
下面看具体代码:
有了查找函数,我们就可以根据查找返回的pos地址来修改数据了,具体代码如下:
我们不妨就把数据2改成数据200,测试结果:
8.任意位置插入函数的实现:SListNodeInsert
对于任意位置插入,我们也还是要先调用查找函数SListNodeFind;然后调用SListNodeCreat进行动态开辟空间。我们根据查找函数SListNodeFind返回的pos地址,在pos地址进行插入操作,具体如下:
情况1:我们还是先考虑普通情况,特殊情况单独拿出来讨论;首先我们肯定要得到pos的前一个位置prev,然后prev->next = newnode,然后newnode->next = pos就可以啦:
情况2:如果是在第一个节点之前插入呢?它同样是没有pos的前一个节点prev,此时怎么办呢?最简单的办法当然是调用头插函数SListNodePushFront啦!当然我们可以去验证在最后一个节点tail前插入也是没问题的;至于空链表的情况,我们会给出限制条件;根本不会让它调用SListNodeInsert函数:
具体代码如下:
我们不妨在1前面插入100,测试一下:
9.任意位置删除函数的实现:SListNodeDelete
同样的思路,我们先考虑普通情况,在分析特殊情况:
情况1:我们既然要删除pos位置,就要知道pos的前一个位置prev,这样才能使prev->next = pos->next;中间跳过pos,具体逻辑图如下:
情况2:问题又来了,如果还是在pos = *pphead位置删除呢?这样pos又没有前一个地址prev,怎么办呢?最简单的方法还是调用以前的函数,这里调用头删函数SListNodePopFront,具体逻辑图如下:
具体代码如下:
我们删除数据3并测试一下结果:
10.求大小函数的实现:SListNodeSize
对于求大小很简单,我们定义一个计数器count就行,这里就不再多数,直接上代码。
具体代码如下:
11.销毁函数的实现:SListNodeDestory
链表的销毁和顺序表不同,顺序表是连续的空间,free一次就可以;而链表创建的空间是不连续的,我们malloc多少次,就需要free多少次,下面看具体代码:
具体代码如下:
所有具体代码:
总结:对于链表的操作,我的建议是一定要画图分析,特别是接下来的双链表;另外就是我们在写各种各样的函数接口,可以先考虑最普通的情况,把特殊的情况单独拿出来进行分析!!!这里我通过画图和文字分析的形式把基本上所有接口都分析了一遍,希望对各位有所帮助;感兴趣的同学也可以写成项目工程的格式!!!
如果对各位有所帮助,请点赞支持一波,万分感谢!!!
结束语
今天的分享就到这里,想要提升编程思维的,快快去注册牛客网开始刷题吧!各种大厂面试真题在等你哦!