线性表有两种基本的物理存储实现方式:
typedef struct {
ElemType data[MaxSize]; // 静态分配
int length;
} SqList;
typedef struct LNode {
ElemType data;
struct LNode *next;
} LNode, *LinkList;
| 特性 | 顺序表 | 链表 |
|---|---|---|
| 存储空间 | 连续的预分配空间 | 不连续的动态分配 |
| 存储密度 | 高(=1) | 低(<1,有指针开销) |
| 容量 | 固定/可扩容 | 动态增长 |
| 逻辑关系 | 隐含(位置) | 显式(指针) |
| 操作 | 顺序表 | 链表 |
|---|---|---|
| 按位查找 GetElem | O(1) | O(n) |
| 按值查找 | O(n) | O(n) |
| 插入/删除(已知位置) | O(n) 移元素 | O(1) 改指针 |
| 尾部插入 | O(1)(有空间) | O(1)(有尾指针) |
插入平均移动次数:在长度为 $n$ 的顺序表第 $i$ 个位置插入,平均移动
$$E = \frac{1}{n+1}\sum_{i=1}^{n+1}(n-i+1) = \frac{n}{2}$$删除平均移动次数:
$$E = \frac{1}{n}\sum_{i=1}^{n}(n-i) = \frac{n-1}{2}$$存储密度:单链表结点存 int(4B)+ 指针(4B),密度 $= 4/(4+4) = 0.5$。
| 维度 | 顺序表胜 | 链表胜 |
|---|---|---|
| 随机访问 | ✅ O(1) | ❌ O(n) |
| 存储密度 | ✅ =1 | ❌ <1 |
| 插入删除 | ❌ O(n) | ✅ O(1) |
| 容量灵活 | ❌ | ✅ 动态 |
| 缓存友好 | ✅ 连续 | ❌ 分散 |
核心结论:顺序表适合读多写少,链表适合写多读少。
暂无关联知识点
↑ 以上为站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。