前言
在学习完线性表中使用数组来存储数据的顺序表后,今天我们来学习使用链式结构来存储数据——链表。
一、链表是什么?
链表是一种物理存储结构上非连续,非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针来链接实现的。
二、链表分类
我们通过链表指针的指向,是否带头,尾节点是否指向头节点,可分为上述几类,它们之间两两组合,共有8种链表。
在往后的使用以及学习的考虑上,我们只重点讲解2种链表:
- 不带头非循环单链表,也就是最简单的一种
- 带头循环双链表,也就是最复杂的一种
三、对于单链表函数的定义以及实现
1.对于单链表节点的定义
typedef int SLTDataType;
typedef struct SListNode
{
SLTDataType data;
struct SListNode* next;
}SLTNode;
我们发现单链表节点结构体非常简单,只需要包含数据及下一节点的指针。
2.对于单链表函数的定义与实现
SLTNode* BuySLTNode(SLTDataType x);
void SListDestory(SLTNode** pphead);
void SListPushFront(SLTNode** pphead, SLTDataType x);
void SListPushBack(SLTNode** pphead, SLTDataType x);
void SListPopBack(SLTNode** pphead);
void SListPopFront(SLTNode** pphead);
SLTNode* SListFind(SLTNode* phead, SLTDataType x);
// 在pos之前插入
void SListInsert(SLTNode** pphead, SLTNode* pos, SLTDataType x);
// 在pos后面插入
void SListInsertAfter(SLTNode* pos, SLTDataType x);
// 删除pos位置
void SListErase(SLTNode** pphead, SLTNode* pos);
// 删除pos后面位置
void SListEraseAfter(SLTNode* pos);
我们发现单链表函数的接口,有时仅需传输一级指针,有时却需要传输二级指针。可以现在在脑海中构建一个单链表,想一想,为什么要传二级指针。
接下来,我们对上述函数一一实现。
SLTNode* BuySLTNode(SLTDataType x)