静态链表是用数组模拟链表操作的一种数据结构。每个数组元素包含两个域:
#define MaxSize 100
typedef struct {
ElemType data;
int next; // 游标,存放下一个元素的数组下标
} SLinkList[MaxSize];
| 特性 | 动态链表 | 静态链表 |
|---|---|---|
| 存储分配 | malloc/free 动态分配 | 预先分配固定大小数组 |
| 指针/游标 | 指针(内存地址) | 整数下标 |
| 适用场景 | 有动态内存管理的系统 | 无指针语言(如 Basic、Fortran) |
| 空间利用 | 按需分配,灵活 | 可能浪费或不足 |
data[MaxSize-1].next 指向第一个空闲位置;分配空间从备用链表头部取结点,释放空间则插回备用链表头部。MaxSize,运行时不可扩展。void InitList(SLinkList L) {
L[MaxSize-1].next = 0; // 备用链表为空
for (int i = 0; i < MaxSize - 1; i++)
L[i].next = i + 1; // 默认全部串起来
}
int MALLOC(SLinkList L) {
int i = L[MaxSize-1].next; // 取备用链表第一个结点
if (i != 0)
L[MaxSize-1].next = L[i].next; // 备用链表头指向下一个
return i;
}
void FREE(SLinkList L, int k) {
L[k].next = L[MaxSize-1].next; // k 的 next 指向原备用链表头
L[MaxSize-1].next = k; // 备用链表头指向 k
}
假设数组大小 6,已有元素 A(下标1)→B(下标3)→C(下标4),在第 i 个位置插入 e:
下标: 0 1 2 3 4 5
data: - A - B C -
next: 1 3 - 4 0 2
↑头 ↑尾 ↑备用链表头
备用链表:5→2→0(下标 5 的 next 是 2,下标 2 的 next 是 0 表示结束)
数据链表:0→1→3→4→0(A→B→C→结束)
删除元素 B:
FREE(L, 3),将下标 3 还给备用链表(暂无关联知识点)
↑ 以上为站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。