1. 线性表基础概念解析
线性表是数据结构中最基础、最常用的结构之一。我们可以把它想象成日常生活中排队买奶茶的队伍:队伍中每个人都严格按顺序排列,除了排在最前面的人(没有前一个人)和最后面的人(没有后一个人),其他每个人都有且只有一个前驱和一个后继。
从专业角度定义,线性表是由n(n≥0)个数据元素组成的有限序列,记为:
L = (a₁, a₂, ..., aₙ)
其中:
- a₁是第一个元素,称为表头元素
- aₙ是最后一个元素,称为表尾元素
- 当n=0时,称为空表
- 对于1<i<n的元素aᵢ,有且仅有一个直接前驱aᵢ₋₁和一个直接后继aᵢ₊₁
关键理解:线性表强调的是元素之间的逻辑关系,而不是物理存储方式。就像排队的人可以站成一列(顺序存储),也可以分散站着但记住前后是谁(链式存储)。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 顺序存储结构深度剖析
2.1 顺序表的物理实现
顺序表是用一段地址连续的存储单元(通常用数组实现)依次存储线性表的数据元素。这种存储方式有三大核心特征:
- 物理连续性:所有元素存储在内存的连续区域,就像停车场中连续的车位
- 随机访问:通过首地址和下标可在O(1)时间内访问任意元素
- 容量固定:初始化时需要确定存储空间大小(虽可扩容但代价较高)
c复制#define INIT_SIZE 10
typedef struct {
int *data; // 存储空间的基地址
int length; // 当前长度
int capacity; // 当前分配的存储容量
} SeqList;
2.2 顺序表的优劣势对比
| 特性 | 优势 | 劣势 |
|---|---|---|
| 访问效率 | O(1)随机访问 | 插入/删除平均需要移动n/2个元素 |
| 空间利用率 | 无指针开销,存储密度=1 | 需要预分配空间,可能浪费或不足 |
| 适用场景 | 频繁访问、元素数量稳定 | 频繁插入删除、元素数量变化大 |
3. 顺序表核心操作实现
3.1 初始化与内存管理
顺序表的初始化需要注意三个关键点:
- 内存分配失败处理
- 初始状态的正确设置
- 扩容策略的设计
c复制Status InitList(SeqList *L) {
L->data = (int *)malloc(INIT_SIZE * sizeof(int))
