概念与结构
概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。

可以用列车车厢来类比链表的结构,每节车厢代表着链表的每一个节点,每个节点之间又相互连接。
结点
与顺序表不同的是,链表里的每节'车厢'都是独立申请(动态申请,不需要预先占用空间,空间复杂度始终为 O(1),这也是链表的一个优点。)下来的空间,我们称之为'结点'。结点的组成主要有两个部分:当前结点要保存的数据和保存下一个结点的地址(指针变量)。图中指针变量 plist 保存的是第一个结点的地址,我们称 plist 此时'指向'第一个结点。如果我们希望 plist'指向'第二个结点时,只需要修改 plist 保存的内容。链表中每个结点都是独立申请的(即需要插入数据时才去申请一块结点的空间),我们需要通过指针变量来保存下一个结点位置才能从当前结点找到下一个结点。

链表的性质
- 链式机构在逻辑上是连续的,在物理结构上不一定连续
- 结点一般是从堆上申请的
- 从堆上申请来的空间,是按照一定策略分配出来的,每次申请的空间可能连续,可能不连续
结合前面学到的结构体知识,我们可以给出每个结点对应的结构体代码: 假设当前保存的结点为整型:
struct SListNode {
int data; // 结点数据
struct SListNode* next; // 指针变量用于保存下一个结点的地址
};
当我们想要保存一个整型数据时,实际是向操作系统申请了一块内存,这个内存不仅要保存整型数据,也需要保存下一个结点的地址(当下一个结点为空时保存的地址为空)。 当我们想要从第一个结点走到最后一个结点时,只需要在当前结点拿取下一个结点的地址就可以了。 因此我们可以看出:链表的存储数据时单向的,可以从头结点查到尾结点,却无法从尾结点到头节点,这是相对于顺序表的缺点。
链表的打印

只需要给头指针即可,令图中的 pcur 指针每次循环指向其所指向的下一个节点,循环结束的判断条件是当 pcur 所指为空指针时,循环结束,证明链表遍历完成。
实现单链表
头文件,相当于所有实现函数的目录。
// SList.h
#include <stdio.h>
SLTDataType;
SLTDataType data;
} SLTNode;
;
;
;
;
;
SLTNode* ;
;
;
;
;
;


