线性表概述
线性表(linear list)是 n 个具有相同特性的数据元素的有限序列。作为一种在实际中广泛使用的数据结构,常见的线性表包括顺序表、链表、栈、队列和字符串等。
从逻辑上看,线性表是连续的直线结构;但在物理存储上,它并不一定连续。通常以数组(顺序存储)或链式结构(链式存储)的形式存在。
顺序表基础
概念与结构
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组来实现。
- 逻辑结构:线性
- 物理结构:线性(连续存储)
顺序表与数组的区别
顺序表的底层结构是数组,可以看作是对数组的封装。它在数组的基础上实现了常用的增删改查接口,提供了更高级的抽象。
本质上:数组 ⊆ 线性表
分类
根据空间分配方式的不同,顺序表主要分为两类:
- 静态顺序表:使用定长数组存储元素。
- 缺陷:空间给少了不够用,给多了造成浪费。
- 适用场景:在竞赛中经常使用静态申请数组的方式,因为效率较高且易于控制。
- 动态顺序表:按需申请内存,不会造成空间浪费。
动态顺序表模拟实现
下面我们来动手实现一个动态顺序表。这部分代码展示了如何管理内存、处理扩容以及实现核心操作。
结构定义
首先定义顺序表的结构体,包含指向数据的指针、当前有效元素个数以及总容量。
// 头文件中
typedef int SLTDataType;
typedef struct SeqList {
SLTDataType* arr; // 存储数据
int size; // 有效数据个数
int capacity; // 空间大小
} SL;
初始化与销毁
初始化时,将指针置空,计数归零。销毁时必须释放动态分配的内存,防止泄漏。
void SLInit(SL* ps) {
ps->arr = NULL;
ps->size = ps->capacity = 0;
}
void SLDestroy(SL* ps) {
if (ps->arr) {
free(ps->arr);
}
ps->arr = NULL;
ps->size = ps->capacity = ;
}


