C 语言顺序表原理与核心算法实战
线性表是 n 个具有相同特性的数据元素的有限序列。顺序表作为其顺序存储结构,在逻辑和物理上均表现为连续,通常基于数组实现。
一、线性表概述
线性表在逻辑上是连续的,但在物理存储上不一定连续(如链表)。常见的线性表包括顺序表、链表、栈、队列等。理解这一点的关键在于区分逻辑结构与物理结构:排队买奶茶时,队伍在逻辑上是一维的,但物理位置上可能分散,这就是典型的逻辑线性而物理非线性的例子。
二、顺序表的概念及分类
1. 概念
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构。本质上就是数组,支持高效的随机访问。
2. 分类
- 静态顺序表:使用定长数组。空间固定,浪费或不足风险并存。
- 动态顺序表:使用动态开辟的数组。可根据需求调整容量,是实际开发中的主流选择。
typedef int SLDataType;
typedef struct SeqList {
SLDataType* array; // 指向动态开辟的数组
int size; // 有效数据个数
int capacity; // 容量空间大小
} SL;
三、动态顺序表的实现
1. 初始化
初始化时需将指针置空,计数归零,确保状态一致。
void SLInit(SL* ps) {
assert(ps);
ps->array = NULL;
ps->size = ps->capacity = 0;
}
2. 扩容机制
当 size == capacity 时触发扩容。为避免内存分配失败导致数据丢失,需使用临时变量接收 realloc 返回值。扩容策略通常采用 2 倍增长,以平衡时间复杂度与空间利用率。
void SLCheckCapacity(SL* ps) {
if (ps->size == ps->capacity) {
int newcapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;
SLDataType* temp = (SLDataType*)realloc(ps->, newcapacity * (SLDataType));
(temp == ) {
perror();
();
}
ps-> = temp;
ps->capacity = newcapacity;
}
}


