news 2026/3/28 0:47:16

数据结构02——顺序表

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
数据结构02——顺序表

一.线性表

线性表(Liner List)是n个具有相同特性元素的有限序列。

线性表具有两个结构特性:物理结构和逻辑结构。物理结构指的是数据在内存中存储的顺序;逻辑结构指的是人为抽象出来的一种结构。

线性表在逻辑结构上一定是线性的,而在物理结构上不一定是线性的。

常见的线性表有:顺序表、链表、栈、队列、字符串等 。

二.顺序表

顺序表(Sequence Liner List)是用一段内存中的连续地址存储数据的一种数据结构,其底层结构为数组。

而由于其在内存中连续存放,所以物理结构是线性的。至此我们可总结出顺序表的两大特性:逻辑结构是线性 && 物理结构也是线性。

顺序表使用数组来实现的,其与数组最大的不同在于,对数组进行了一定程度的封装,通过函数实现了较为便捷的增删查改的操作。

三.顺序表的分类

由于顺序表是由数组来实现,而数组通过实现方式的不同可以分为定长数组(直接定义好数组长度)和柔性数组(通过动态内存管理来分配栈区空间):所以顺序表也可以分为静态顺序表和动态顺序表。

3.1静态顺序表

#define N 100

typedef int SeqListDatatype
typedef struct SeqList
{
SeqListDatatype arr[N];
int size;
}SeqList;
静态顺序表由一个定长数组arr[N]和int类型的size变量组成,其中size变量用来指示当前顺序表操作到哪个下标位置的元素。而通过将int类型重命名为SeqListDatatype类型,就可以将顺序表i存储的元素进行较为方便的转换。

而静态顺序表最大的缺陷在于代码一开始实现时就决定的数组长度,而面对现实情况大部分是不确定的,所以一种针对于不同长度需要而定义的动态顺序表就应需而生。

3.2动态顺序表

typedef int SeqListDatatype;
typedef struct SeqList
{
SeqListDatatype* arr;
int size;
int capacity;
}SeqList;

动态顺序表由一个SeqListDatatype类型的指针,下标元素和指示当前顺序表空间的capacity变量构成。根据实际大小的需要,动态申请不同的空间来满足需求。

四.动态顺序表的具体实现

以下是头文件中一些函数的定义

在SeqList.h的定义中,首先定义了动态顺序表的结构体类型,然后声明了初始化、打印、增删查改等数据操作,往下一个一个函数进行说明。

4.1 顺序表的初始化函数 ——void SeqListInit(SeqList* SL);

首先定义了一个顺序表:SeqList SList = { 0 };

具体实现方式如下图所示:

首先进行数组空间的分配,初始化的时候先分配4个,之后根据需要会在增添数据的时候进行合理扩容。分配4个空间,所以capacity应该为4;由于数组中没有放置任何元素,所以size应该指向0下标的元素。

4.2数据打印函数——void SeqListPrint(SeqList* SL);

整体实现如下图:

整体思路较为简单,只需要遍历整个顺序表,然后按顺序打印数据即可。

4.3扩容函数——Judge_And_Increase(SeqList* SL)

由于扩容函数仅仅在增加数据时需要用到,所以没有将其声明在头文件,整体实现如下图:

判断条件为: size指向的下标如果和capacity相同,就代表当前顺序表的空间已经不够用了,所以需要进行扩容。合理的扩容思路为每次扩容的容量大小为上之前的倍数,在这里取2倍。用realloc函数进行空间的扩容。

4.4尾插数据函数——void SeqListPushBack(SeqList* SL, SeqListDatatype x)

尾插数据,因为要添加数据,所以要先判断容量是否足够。之后将size下标的位置替换为要添加的数据x即可,之后要将size自增从而指向下一个位置。

4.5 头插数据——void SeqListPushFront(SeqList* SL, SeqListDatatype x)

头插与尾插最大的不同在于,头插数据需要把下标为0的位置空出来,让新数据插入。而空出头元素则需要将数组的元素整体向后移,仍然需要先判断空间是否足够大。将元素依次后移,就可以将下标为0的位置放置数据x。

4.6尾删数据——void SeqListDeleteBack(SeqList* SL)

尾删数据,不需要真正把最后一个元素删除,只需要遍历数组的时候让其索引不到即可,所以将size向前挪动一位,这样下次不论是头插还是尾插数据,都会将这个元素替换为新元素。

4.7头删数据——void SeqListDeleteFront(SeqList* SL)

头删数据思路与尾删数据类似,头删只需要将从下标为1开始的数据依次向前移动,将第一个位置替代即可。

4.8查找数据并返回对应下标——int SeqListSearch(SeqList* SL, SeqListDatatype x)

仍然是遍历数组,如果找到数组中与指定x相同的数据,返回相应的下标即可。而由于数组中下标不会出现-1,所以定义如果找不到这个元素,返回-1。

4.9指定位置之前插入数据——void SeqListInsert(SeqList* SL,int pos, SeqListDatatype x)

指定位置之前插入数据,首先仍需要判断空间是否足够,然后将这个位置的数据依次向后挪动,将这个位置留出一个空间,再将数据x放入。

4.10指定位置数据删除——void SeqListDelete(SeqList* SL, int pos)

从该位置开始,将之后的数据提前,将pos位置的数据覆盖即可达到指定位置删除的效果。

4.11销毁顺序表——void SeqListDestroy(SeqList* SL)

由于顺序表的空间是通过动态内存函数calloc和realloc函数进行申请,所以用完之后需要free,同时将容量capacity和下标size置为0即可。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/27 6:43:07

YOLOv9训练周期长?epochs/close-mosaic参数优化实战

YOLOv9训练周期长?epochs/close-mosaic参数优化实战 你是不是也遇到过这样的情况:启动YOLOv9训练后,盯着终端日志等了大半天,发现loss曲线还在“原地踏步”,验证mAP迟迟不见起色,而训练时间已经快赶上一次…

作者头像 李华
网站建设 2026/3/27 11:40:23

实测fft npainting lama性能,修复一张图只要10秒

实测FFT NPainting LaMa性能,修复一张图只要10秒 本文不涉及任何傅里叶变换原理推导,不讲解频域分析,不讨论DFT/DFS/FFT数学关系——我们只关心一件事:这张图,能不能修好?修得快不快?效果稳不稳…

作者头像 李华
网站建设 2026/3/27 20:56:47

JLink驱动支持多核MCU调试的操作实践案例

以下是对您提供的技术博文进行 深度润色与结构化重构后的专业级技术文章 。全文已彻底去除AI生成痕迹,强化工程语境、实战逻辑与教学节奏,语言更贴近资深嵌入式工程师的表达习惯——既有“踩坑”经验的坦率分享,也有底层机制的精准拆解&…

作者头像 李华
网站建设 2026/3/27 12:00:10

告别繁琐配置!PyTorch-2.x-Universal-Dev-v1.0一键启动

告别繁琐配置!PyTorch-2.x-Universal-Dev-v1.0一键启动 1. 为什么你需要这个镜像? 你是否经历过这样的场景:刚买来一台新机器,兴致勃勃想跑通第一个深度学习模型,结果卡在环境配置上整整半天? pip insta…

作者头像 李华
网站建设 2026/3/27 19:12:49

颠覆级单机体验:PlugY全功能解析与实战指南

颠覆级单机体验:PlugY全功能解析与实战指南 【免费下载链接】PlugY PlugY, The Survival Kit - Plug-in for Diablo II Lord of Destruction 项目地址: https://gitcode.com/gh_mirrors/pl/PlugY 在暗黑破坏神2的单机游戏领域,玩家长期受限于原版…

作者头像 李华
网站建设 2026/3/27 16:30:07

炉石传说智能脚本完全指南:从入门到精通的实用技巧

炉石传说智能脚本完全指南:从入门到精通的实用技巧 【免费下载链接】Hearthstone-Script Hearthstone script(炉石传说脚本)(2024.01.25停更至国服回归) 项目地址: https://gitcode.com/gh_mirrors/he/Hearthstone-S…

作者头像 李华