链表含义
链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成。有单链表、双链表和循环链表。相比于数组更为灵活。
链表中的节点在内存中不是连续分布的 ,而是散乱分布在内存中的某地址上,分配机制取决于操作系统的内存管理。
![](https://i-blog.csdnimg.cn/blog_migrate/a9ae869fa6f7066d5db656982db9d245.png)
头结点、头指针和首元结点
上图所示的链表并不完整,一个完整的链表应该由以下几部分构成:
头指针:一个和结点类型相同的指针,它的特点是:永远指向链表中的第一个结点。上文提到过,我们需要记录链表中第一个元素的存储位置,就是用头指针实现。
结点:链表中的节点又细分为头结点、首元结点和其它结点:
头结点:某些场景中,为了方便解决问题,会故意在链表的开头放置一个空结点,这样的结点就称为头结点。也就是说,头结点是位于链表开头、数据域为空(不利用)的结点。
首元结点:指的是链表开头第一个存有数据的结点。
其他节点:链表中其他的节点。
也就是说,一个完整的链表是由头指针和诸多个结点构成的。每个链表都必须有头指针,但头结点不是必须的。
例如,创建一个包含头结点的链表存储 {1,2,3},如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/f64dcc2d547a108d833753a07a19e2b4.gif)
完整的链表示意图
再次强调,头指针永远指向链表中的第一个结点。换句话说,如果链表中包含头结点,那么头指针指向的是头结点,反之头指针指向首元结点。
链表(单链表)是什么 (biancheng.net)
链表定义
初始化
typedef int SLTDataType;//typedef给数据格式重命名 给结构体定义名称为 SListNode
typedef struct SListNode
{
SLTDataType data;
struct SListNode* next;//结构体中使用自身结构体 结构体指针 (struct可以省略)
}SListNode,SLN;//给结构体定取别名为 SLN
//typedef struct Student SStudent; 还可以这样 用 typedef 给结构体取别名
删除/添加链表节点:指针移位即可 时间复杂度O(1)
注:删除最后一个节点的时间复杂度是O(n),因为需要从头节点查找到倒数第二个节点通过next指针进行删除操作
【C语言】链表太难学不懂?看这一篇就够了_慕雪华年的博客-CSDN博客_c语言链表
(14条消息) C语言链表操作详解_顾十方的博客-CSDN博客_链表c语言
链表(单链表)是什么 (biancheng.net)