用C语言实现一个链表(一)
一、准备工作
1.何为链表?
在前两期内容中,我们介绍了顺序表,和顺序表一样,链表也是一种线性表(具有相同特性的数据元素的有限序列),即逻辑结构连续。不同的是,链表的物理存储结构是不连续的,它的逻辑顺序通过指针链接次序来实现。如图所示:
链表的每一个小单元就称为一个结点。
链表的结构有很多种,非常灵活:
(1)单向或者双向
(2)带有头结点或者不带头结点
(3)循环或者非循环
本期内容将为大家介绍的是单链表的C语言实现,后面还会给大家介绍双向循环链表。
2.实现一个链表,我们需要些什么?
(1)data
data是指节点存储的数据,称为结点的数据域,其类型通过typedef来灵活定义。
(2)指针
结点除了存放数据之外,还要留有指向下一个结点的指针,称为指针域,通常被命名为next。
(3)结构体
一个结点中包含数据域和指针域,我们可以将它们放入一个结构体中,如图:
要注意的是,虽然struct是数据类型,但它和int,float这些内置类型不同,它是自定义类型,在写指针变量时,int型指针使用int*,double型指针使用double* 即可,但结构体指针要带上自己定义的名字struct LinkNode*,因为结构体的种类是有很多的,只有在struct后面加上名字,才知道是指向的哪种结构体,现在是struct LinkNode*,说明next指向的是下一个结构相同的结构体,而不是别的什么结构体。
二、链表的实现(代码+分析)
顺序表的核心是数组,链表的核心是指针。在创建一个链表前,我们应定义一个指针,先将其置为空指针(NULL),然后再通过对应的函数,使其指向一个存储数据的新结点。我们实现的是不带哨兵位头结点的链表,也就是说第一个节点就要存储数据。
int main()
{
LinkNode* plist = NULL;
return 0;
}
1.创建新结点
创建一个新节点,需要开辟一个空间,可以使用动态内存开辟的方式向堆区申请,创建的新结点数据域为需要添加的数据,指针域为空,因此函数只要提供需要添加的数据即可。如图所示,创建的新节点是单独在外的,并没有和链表链接,至于如何链接,取决于怎样插入链表中,后面会有对应的函数来实现。