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


