一、线性表的概念
线性表(linear list)是 n 个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表包括顺序表、链表、栈、队列、字符串。线性表在逻辑上是线性结构,即连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。
二、顺序表的概念
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。
三、顺序表的分类
顺序表分为两种:静态顺序表和动态顺序表。每一种都属于它自己的价值,在实际应用中。一般使用动态顺序表较多,比如我们经常用的通讯录(因为静态顺序表只适合事前知道需要多少内存的情况下,不然会出现申请多少内存问题),接下来我们将实现动态顺序表。
四、顺序表接口实现
4.1 顺序表的初始化
初始化顺序表,为其分配初始的内存空间并设置初始的有效数据个数和容量:
// 初始化顺序表:为顺序表分配初始内存空间,并设置初始状态
void SeqListInit(SeqList* ps) {
// 初始分配能存储 4 个 SLDataType 类型元素的内存空间(小容量起步,避免初始内存浪费)
ps->arr = (SLDataType*)malloc(4 * sizeof(SLDataType));
// 检查内存分配是否成功:若 malloc 返回 NULL,说明分配失败
if (ps->arr == NULL) {
perror("malloc failed: ");
return;
}
// 初始化有效元素个数为 0(刚创建的顺序表暂无数据)
ps->size = 0;
// 初始化容量为 4(与实际分配的内存空间大小对应)
ps->capacity = 4;
}
4.2 顺序表的扩容
当顺序表的空间不足时,需要进行扩容操作,以保证新数据能够顺利存储:
// 检查顺序表容量,若空间已满则进行扩容
void CheckCapacity(SeqList* ps) {
// 当有效元素个数等于容量时,说明空间已满,需要扩容
if (ps->size == ps->capacity) {
// 采用二倍扩容策略:平衡扩容效率与空间浪费(避免频繁扩容)
size_t newCapacity = ps->capacity * 2;
// 调用 realloc 调整内存大小:新空间为 newCapacity 个 SLDataType 类型
SLDataType* newArray = (SLDataType*)(ps->arr, newCapacity * (SLDataType));
(newArray == ) {
perror();
;
}
ps->arr = newArray;
ps->capacity = newCapacity;
}
}


