普通的单链表的各个结点在内存中的分布是随机的,星罗棋布的。
而静态链表是通过用一个数组来表示,在内存中有一整片连续的空间,各个结点集中安置。
用代码定义一个静态链表
静态链表的结点包含一个存储的数据元素,以及一个int型用于存放下一个数组的下标。
#define MaxSize 10 // 静态链表的最大长度
struct Node
{
ElemType data;
int next; // 下一个元素的数组下标
};
void textSLinkList(){
struct Node a[MaxSize]; // 数组a作为静态链表
//......
}
另一种写法:
typedef struct
{
ElemType data;
int next; // 下一个元素的数组下标
}SLinkList[MaxSize];
void textSLinkList(){
SLinkList a;
//......
}
这两种写法是等价的。
第一种:定义一个struct Node类型,长度为MaxSize的名为a的数组,用这个数组表示链表。
第二种:在定义结构体的时候就已经定义了一个长度为MaxSize的Node型数组,后续代码中就可以直接使用SLinkList定义了。
基本操作简述
- 初始化静态数组:将a[0]的next设为-1,将其他结点的next设为一个特殊值用来表示结点空闲,如-2.
- 查找: 从头结点出发挨个往后遍历结点
- 插入位序为i的结点:
- ①找到一个空的结点,存入数据元素
- ②从头结点出发找到位序为i-1的结点
- ③修改新结点的 next
- ④修改 i-1 号结点的 next
- 删除某个结点:
- ①从头结点出发找到前驱结点
- ②修改前驱结点的游标
- ③被删除结点 next 设为 -2
总结
静态链表: 用数组的方式实现的链表
优点: 增、删操作不需要大量移动元素
缺点: 不能随机存取,只能从头结点开始依次往后查找; 容量固定不可变
适用场景:
①不支持指针的低级语言;
②数据元素数量固定不变的场景(如操作系统的文件分配表FAT)