初始化链表
实现接口:
尾插
头插
头删
尾删
任意插入,在pos的前面插入x
任意删除,删除pos位置的值
释放空间
初始化链表
我们可能首先想到要对链表进行初始化,但是磨刀不误砍柴工,我们首先更应该创建工程文件,方便我们后期对程序的管理和维护。
SList.h头文件——声明函数
SList.c——函数实现
test.c——主函数
如果看过我之前写的顺序表(一),我们就能很顺利地创建出工程文件。
然后我们就对链表进行初始化
在头文件中写入:
//方便后续修改类型
typedef int SLTDateType;
//结构
struct SListNote
{
//数据类型
SLTDateType data;
//指针,不要迷糊了
struct SListNote* next;
};
typedef struct SLNotelist SLTNote;
这样做,是一种思想——我们能对链表结构中的内容进行掌握
//方便后续修改类型
typedef int SLTDateType;
然后在写入test.c(主文件)中就行了
#include"SList.h"
int main()
{
//指向结构体的指针
SListNote* plist = NULL;
return 0;
}
当然一股脑全写入主函数中显得文件很臃肿。我们可以稍微修改一下
void TestSList1()
{
//指向结构体的指针
SListNote* plist = NULL;
}
int main()
{
TestSList1();
return 0;
}
如此一来就方便我们后面的调试
接下来就是接口的调试
实现接口:
尾插
先来个尾插,这里我们可以对照学习顺序表(一)中的尾插
了解一下顺序表逻辑结构的原理
原理图如下:
但是我们仍然对链表的概念仍然比较模糊,我们可以尝试用物理结构进行分析
通过视图,我们发现通过指针指向下一个节点的地址从而实现链表的基本结构
那么这又和尾插之间有什么关系呢?
那么我们再来看一组视图
那么了解清楚原理之后,写出函数便是一件轻松的事了,但是我们不可以大意仍然有些细节点不可忽视
在SList.h头文件中写入
//接口的实现
//可能会改变链表的头指针,传二级指针
//尾插
void SListPushBack(SListNote** pphead, SLTDateType x);
在SList.c中写入
//尾插
void SListPushBack(SListNote** pphead, SLTDateType x)
{
//形参改变无法影响实参
//申请一块空间,node - 节点
SListNote* newnote = (SListNote*)malloc(sizeof(SListNote));
newnote->data = x;
newnote->next = NULL;
//pphead是plist的地址
//*pphead是plist指针
//phead可能为空
if (*pphead == NULL)
{
*pphead = newnote;
}
else
{
//tail是当前位置
SListNote* tail = *pphead;
//找到尾节点的指针
//判下一个位置为空,可以避免自身变为空
while (tail->next != NULL)
{
//下一个位置
//tail是当前位置的地址,tail->next存的是下一个位置的地址
tail = tail->next;
}
//尾节点,链接新节点
tail->next = newnote;
}
}
在这里很多人都会犯传入一级指针从而形参无法改变实参,导致无法指向下一个节点等问题
实现完尾插,感兴趣的小伙伴可以尝试用一下。可以借鉴一下顺序表(三),看看如何调用。
下期将给大家带来剩下的接口实现,感兴趣的小伙伴可以点个关注和赞就是对我最大的支持和鼓励!