本节复习链表的增删查改
首先, 链表不是连续的, 而是通过指针联系起来的。 如图:
这四个节点不是连续的内存空间, 但是彼此之间使用了一个指针来连接。 这就是链表。
现在我们来实现链表的增删查改。
目录
本节函数接口列表
准备文件
建立结构体蓝图
申请链表节点函数接口
单链表的打印函数接口
单链表尾插函数接口
单链表头插函数接口
单链表尾删函数接口
本节函数接口列表
//申请链表节点函数接口
SLNode* BuySListNode(SLTDataType x);
//单链表的打印函数接口
void SListPrint(SLNode* phead);
//单链表尾插函数接口
void SListPushBack(SLNode** pphead, SLTDataType x);
//单链表头插函数接口
void SListPushFront(SLNode** pphead, SLTDataType x);
//单链表尾删函数接口
void SListPopBack(SLNode** pphead);
//单链表的头删函数接口
void SListPopFront(SLNode** pphead);
准备文件
首先准备好三个文件夹, 一个main.c文件夹, 一个.h文件夹用来声明链表的接口以及定义结构体等。 一个.c文件夹用来实现单链表。
建立结构体蓝图
首先包含一下头文件, 定义一下数据类型。
接着再建立一个链表的结构体
申请链表节点函数接口
申请链表的节点操作, 在尾插, 头插, 或者特定位置插入的时候都需要, 所以可以封装成一个函数。 后续直接进行复用就可以。
.h函数声明
.c函数实现
在实现的过程中,可以将数据直接储存到新节点中。 然后让新节点指向NULL, 然后返回该节点。 然后将链表直接连接到这个节点就可以。
单链表的打印函数接口
为了便于后续的函数接口的调试, 我们先实现单链表的打印操作。
.h函数声明
.c函数实现
单链表尾插函数接口
.h函数声明
.c函数实现
尾插接口时传送phead的指针的原因是因为phead可能改变指向,从空指针变为指向一个节点。要改变phead的指向那就是意味着形参要相对于phead传址调用, 而phead本身就是一个一级指针, phead取地址就是一个二级指针, 所以形参是二级指针。
单链表头插函数接口
.h函数接口
.c函数实现
现在我们来利用打印接口调试一下我们写的是否存在问题。
通过检验,没有问题。 继续往下走。
单链表尾删函数接口
.h文件声明
.c函数实现
首先pphead不能为空, 如果phead指向空的话就直接返回。 然后定义cur和prev两个指针, 遍历寻找尾节点。 cur领先prev一个节点, cur指向尾节点的时候, 就释放掉这个节点。 然后prev指向空节点。 寻找尾节点的过程是这样的:
代码实现
单链表的头删函数接口
.h函数声明
.c函数实现
代码的意思是, 首先pphead不能为空, 然后phead不能指向空。 然后让一个cur指针指向头节点。 然后修改phead的指向, 使其指向第二个节点(当第二个节点是空的时候, 就是指向空)。然后释放cur指向的节点也就是头节点。 如图为过程: