<div id="navCategory"></div>
讯享网
链表是一种数据结构,用于数据的存储。
如图,每一个链表节点所在的内存空间是不延续的,因为不是连续存储,所以需要存入下一个节点的地址,这样方便找到下一个数值,而最后一个链表指向的空间为NULL,因此我们可以声明一个结构体,代表一个节点。

SListNode 是我们的节点结构体,ListDataType是存储数据的类型。
链表的节点建立好后,接下来我们来进行尾部插入数据。
那么我们只需要找到尾部节点,把尾部节点指向的NULL值置为新节点。新节点指向NULL

因此我们要新建一个节点,然后找到最后一个节点。
但是这种方法,我们需要注意一种情况,那就是如果链表中本身没有节点,那么cru初始就是一个空指针,而循环条件我们对空指针进行了解引用,所以我们需要判断一下。
然后我们测试一下,发现链表已经链接起来了

为了方便后面测试,我们决定先实现打印链表的函数。我们只需要依次查找节点指向的元素,直到最后一个指向NULL时,我们停下来。

头部插入和尾部插入差不多,我们只需要把新节点指向链表中的第一个节点,然后把头节点换成新节点。

因为我们尾插的时候创建了节点,头插又创建节点,太麻烦了,所以我们把创建节点封装成一个函数。
尾插函数调整

头插函数
头插测试

尾删也就是删除链表中的最后一个节点。那么我们需要找到最后一个节点,把它释放,并且要把它的前一个节点置为空指针,否则它会变成一个野指针。


但是这个尾删是建立在有数据的情况下的,如果没有数据我们进行此操作,那会造成空指针prve访问,所以我们在前面要断言一下
即使这样,以上代码依然有问题,因为当链表只有一个节点时,并不会进入while循环,也就导致 prve对空指针解引用,所以我们还需要判断一下,如果链表只有一个节点,那么就直接释放头节点。
代码测试

尾删都会了,头删还远吗?头删我们只需要把头节点指向的空间释放,然后让头节点的指针指向下一个节点。

当然,如果链表为空,我们是无法操作的,我们也要断言或者if判断一下。
测试一下代码

在链表里查找值,我们只需要找节点,如果与找的值相等,就返回当前下标或者节点,这里我们用返回节点演示。
看看测试结果


链表里我们插入了三个值,1,2,3。然后找1的值并返回当前节点,最终提示我们找到了。

当然,也可以用返回下标的方式,然后利用下标控制查找次数。
指定插入,我们这里来演示前插,也就是在一个节点的前面进行插入,我们只需要把这个节点前面的节点指向新节点,然后新节点指向这个节点。

所以我们要先创建一个节点,让**入节点之前的节点指向该节点,让新节点指向**入的节点。
此时这个代码仍有问题,因为如果 pos是第一个节点时,cru->next无法判断判断第一个节点,所以我们要加个判断,如果是头节点,直接调用头插函数。
代码测试

指定删除和指定插入差不多,我们只需要把被删除节点的前一个节点,指向后一个节点,然后删除节点。如果要删除的是头节点,直接调用头删函数,或者也可以再次写一个头删。

代码测试

如果这个链表不想用了,我们想要清空链表。那我们只需要把依次释放内存。
然后我们测试一下,发现所有的节点都置空了


以上代码以上传至git,点这里获取
到此这篇关于手把手教你实现一个C++单链表的文章就介绍到这了,更多相关C++单链表内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/162384.html