数据结构:顺序表
线性表基础
线性表(Linear List)是 n 个具有相同特性的数据元素的有限序列。这是一种在实际中广泛使用的数据结构,常见的线性表包括顺序表、链表、栈、队列和字符串等。
从逻辑上看,线性表是连续的直线结构;但在物理存储上,它并不一定连续。通常以数组或链式结构进行物理存储。
顺序表概述
概念与结构
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组来实现。
- 逻辑结构:线性
- 物理结构:线性(连续内存)
顺序表与数组的区别
顺序表的底层结构是数组,可以看作是对数组的封装。它在数组的基础上实现了常用的增删改查接口,提供了更高级的操作抽象。
关系上:数组 ⊆ 线性表。
分类
静态顺序表
使用定长数组存储元素。
缺陷:空间分配固定。给少了不够用,给多了造成空间浪费。 不过在竞赛场景中,为了效率,经常直接使用静态申请数组的方式。
动态顺序表
按需申请内存,不会造成空间浪费,灵活性更高。
动态顺序表模拟实现
下面我们通过 C/C++ 来手动实现一个动态顺序表,理解其背后的内存管理逻辑。
1. 定义结构体
在头文件中定义顺序表的结构,包含数据指针、有效元素个数和当前容量。
// 定义数据类型
typedef int SLTDataType;
// 定义顺序表结构
typedef struct SeqList {
SLTDataType* arr; // 存储数据的指针
int size; // 有效数据个数
int capacity; // 当前分配的总空间大小
} SL;
2. 初始化
初始化时,将指针置空,计数归零。
void SLInit(SL* ps) {
ps->arr = NULL;
ps->size = 0;
ps->capacity = 0;
}
3. 销毁
释放动态分配的内存,并重置状态,避免野指针或重复释放。
void SLDestroy(SL* ps) {
if (ps->arr) {
free(ps->arr);
ps->arr = ;
}
ps->size = ;
ps->capacity = ;
}


