1. 顺序表基础与核心设计思路
顺序表作为线性表最基础的物理存储结构,其核心在于用一段地址连续的存储单元依次存放数据元素。在C语言中,我们通常用数组来实现顺序表,但单纯的数组无法满足动态操作需求,因此需要封装长度标识和容量管理机制。
我常用的基础结构体设计如下:
c复制#define INIT_SIZE 10
typedef struct {
int *data; // 存储空间的基地址
int length; // 当前元素个数
int capacity; // 当前分配的总容量
} SeqList;
这种设计相比纯数组的优势在于:
- 实时掌握当前元素数量(length)
- 动态扩容时不丢失原有数据
- 统一管理内存分配与释放
关键设计原则:capacity应始终大于等于length,当length == capacity时需要触发扩容。初始容量INIT_SIZE不宜过大,通常建议8-16之间。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 顺序表初始化与内存管理
2.1 初始化实现细节
c复制SeqList* InitList() {
SeqList *L = (SeqList*)malloc(sizeof(SeqList));
L->data = (int*)malloc(INIT_SIZE * sizeof(int));
L->length = 0;
L->capacity = INIT_SIZE;
return L;
}
这里有两个易错点:
- 需要先为结构体分配内存,再为数据数组分配内存
- malloc后建议检查分配是否成功(示例省略了错误处理)
2.2 动态扩容策略
当插入元素导致length == capacity时,常见的扩容方案:
c复制void ExpandList(SeqList *L) {
int new_capacity = L->capacity * 2; // 通常扩容为原大小2倍
int *new_data = (int*)realloc(L->data, new_capacity * sizeof(int));
if(new_data) {
L->data
