
🔥小龙报:个人主页
🎬作者简介:C++研发,嵌入式,机器人等方向学习者
❄️个人专栏:《C语言》《【初阶】数据结构与算法》
✨ 永远相信美好的事情即将发生

前言
动态顺序表是 C 语言数据结构的入门核心,作为线性表的重要实现形式,它依托动态内存管理突破静态数组的固定长度限制,兼顾空间利用率与操作灵活性。本文聚焦动态顺序表的底层逻辑,拆解初始化、销毁等核心操作,结合完整代码示例,帮初学者夯实基础,理解线性表的动态特性与工程价值
注:动态数据结构在项目工程有巨大意义,如果对静态方式实现感兴趣的同学可以看看笔者的《算法通关指南》
一、线性表
线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串...
线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。


二、顺序表
2.1概念及结构
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组(动态开辟)上完成数据的增删查改

2.1.1 辨析顺序表与数组的区别
以一个例子数组:苍蝇馆子,顺序表:米其林

总结:顺序表本质是数组但提供了很多的方法(函数)对数组进行封装,开箱即用因此就变成了一个很厉害的数据结构
2.2 动态顺序表实现框架
我们将以三个文件实现(在本单元结束,也会把完整代码附上希望对你有帮助)

2.2.1 SeqList.h
c
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
typedef int SLDateType;
typedef struct SeqList
{
SLDateType* a; //存储数据
int size; //有效数据个数
int capacity; //空间容量
}SL;
void SLInit(SL* ps);
void SLDestory(SL* ps);
要点解析 :

这里分别对int类型和顺序表进行了重名命,给int重命名是为了方便后续的修改,比如我想把一些用了SLDataType的变量从int类型修改成char,只用在重命名这个地方修改就可以了。
然后是顺序表的重命名,这里将顺序表重命名为SL,后续使用起来更加方便,看起来也会更加清晰。
2.2.2 SeqList.c
c
#include "SeqList.h"
//顺序表的初始化
void SLInit(SL* ps)
{
ps->a = NULL;
ps->size = ps->capacity = 0;
}
//顺序表的销毁
void SLDestory(SL* ps)
{
if (ps->a) ///等价于 if(ps->arr != NULL)
free(ps->a);
ps->a = NULL; //防止成为野指针
ps->size = ps->capacity = 0;
}
2.2.3 test.c
c
#include "SeqList.h"
int main()
{
SL s;
SLInit(&s);
SLDestory(&s);
return 0;
}
要点解析:

我们这里传参数,一定要采用传址调用的形式,否则会出现一些错误(在这里会报未初始化的局部变量s1这个错误),因为传值调用修改形参并不影响实参,它们的地址终究还是不同的,而传址调用,形参的修改会影响实参
总结与每日励志
✨ 本文详细讲解了动态顺序表的实现原理与核心操作。顺序表作为线性表的物理连续存储结构,通过数组动态管理内存空间。文章从概念辨析入手,比较顺序表与普通数组的区别,重点剖析动态顺序表的初始化、扩容和释放等关键操作。通过头文件定义、源文件实现和测试用例三个模块,展示了完整的代码框架。特别强调了传址调用的必要性,避免内存管理中的常见错误。动态顺序表作为数据结构基础,对理解更复杂的数据组织形式具有重要意义。文章代码示例清晰,原理讲解透彻,适合初学者系统学习。
