上一篇中介绍了顺序表,今天介绍单链表,链表分为单链表(单向不带头不循环链表)和双链表(双向带头循环链表)均为线性表。接下来具体介绍单链表:
一.单链表的基本结构(单链表是有节点组成的)
单链表的基本结构本质上是一个结构体如:
struct SListNode
{
int data;
struct SListNode*next;
};
二.单链表实现的代码展示
与顺序表一样,单链表工程也分三个文件:SList.h、SList.c、test.c
1.SList.h文件
其中包含了对单链表节点的定义,以及各个功能函数的声明。
2.SList.c文件
①.打印单链表
因可以通过单链表第一个节点来找到整个链表,所以通过一个循环将节点中的数据依次打印出来即可。
②.创建节点
因为只要插入数据就需要创建一个新的节点,所以就把创建节点单独分装成一个函数,当然也很简单,用malloc动态开辟一块空间,其中下一个节点的地址不清楚,就先付为空。
③.尾插
当链表为空时:将新创建的节点地址付给单链表第一个节点*pphead即可,如下图
当链表不为空时:先找到原链表最后一个节点,再让原链表的next指针指向新创建的节点即可。
④.头插:先让新节点的next指向*pphead,再让*pphead付为新节点的地址(因为链表为空的情况包含在链表不为空的情况中,所以并没有分类写)。
⑤.尾删:链表不能为空
只有一个节点时:直接将该节点free掉,并将其付为空即可。
有多个节点时:先找到倒数第二个节点,然后free掉最后一个节点,再让倒数第二节点的next指向NULL。
⑥.头删:先存下第二个节点的地址,然后free掉第一个节点,再让*pphead付为第二个节点的地址。
⑦.查找:从第一个节点开始遍历链表查找即可,找到返回节点地址,否则返回NULL。
⑧.在指定位置之前插入数据
当指定位置为第一个节点时:就是头插
其他情况:找到POS前一个节点,让其的next指向新节点,再让新节点的next指向POS。
⑨.在指定位置之后插入数据
指定位置为最后一个节点时和在其他位置时代码写法是一样的。
⑩.删除指定位置的数据
当指定位置为第一个节点时:就是头删
是其他位置时:先找到POS前一个节点,然后让他的next指向POS的下一个节点,再free掉POS。
⑪.删除指定位置之后的数据:先找到POS,再让POS的next指向下一个节点的下一个节点,最后free掉POS的下一个节点。
⑫.销毁链表:因链表的节点都是用malloc动态开辟的,在不用时要及时销毁,避免内存泄漏。
3.test.c文件
这里面是我对前面那些功能函数的测试,可以根据自己的习惯写自己的测试。
三.结束
单链表的一些基本功能就讲完了,可以根据自己的喜好添加些别的功能,文章有什么不足欢迎大家指出。