文章目录
链表介绍
链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。
实际中,链表的结构多种多样:
1、带头,不带头。

2、单向,双向。

3、循环,非循环。

通过以上的这些情况组合起来,就有八种链表结构。即带头单向循环链表、带头单向非循环链表、带头双向循环链表、带头双向非循环链表、无头单向循环链表、无头单向非循环链表、无头双向循环链表、无头双向非循环链表。
本篇博客讲解的是无头单向非循环链表。
初始化链表
链表是由一个个结点链接而成,创建一个链表之前,我们首先要创建一个结点类型,该类型由两部分组成:数据域和指针域。
typedef int SLTDataType;//篇博客以存放整型数据为例
typedef struct SListNode
{
SLTDataType data;//数据域:用于存储该结点的数据
struct SListNode* next;//指针域:用于存放下一个结点的地址
}SListNode;
打印单链表
打印链表时,我们需要从头指针指向的位置开始,依次向后打印,直到指针指向NULL时,结束打印。
//打印链表
void SListPrint(SListNode* plist)
{
SListNode* cur = plist;//接收头指针
while (cur != NULL)//判断链表是否打印完毕
{
printf("%d->", cur->data);//打印数据
cur = cur->next;//指针指向下一个结点
}
printf("NULL\n");//打印NULL,表明链表最后一个结点指向NULL
}
增加结点
仔细想想,每当我们需要增加一个结点之前,我们必定要先申请一个新结点,然后再插入到相应位置,于是我们可以将该功能封装成一个函数。
//创建一个新结点,返回新结点地址
SListNode* BuySLTNode(SLTDataType x)
{
SListNode* node = (SListNode*)malloc(sizeof(SListNode));//向新结点申请空间
if (node == NULL)
{
printf("malloc fail\n");
exit(-1);
}
node->data = x;//将数据赋值到新结点的数据域
node->next = NULL;//将新结点的指针域置空
return node;//返回新结点地址
}

本文详细介绍了无头单向非循环链表的初始化、打印、插入、删除、查找和修改等基本操作,包括头插、尾插、在给定位置前后插入、头删、尾删及删除指定位置结点的方法。此外,还提供了相应的C语言实现代码。
最低0.47元/天 解锁文章
452





