数据结构--顺序表
目录一、顺序表的定义1、顺序表的概念及结构1.1线性表2、顺序表概念和分类2.1 静态顺序表2.2 动态顺序表二、动态顺序表的实现1、创建文件2、顺序表的实现2.1、创建顺序表2.2、实现接口里面的功能2.2.1、SLInit(SL* ps) 接口的实现细节2.2.2、SLDestroy(SL* ps)接口的实现细节2.2.3、SLPrint(SL* ps) 接口的实现细节2.2.4、SLCheckCapacity(SL* ps) 接口的实现细节2.2.5、SLInsert(SL* ps, int pos, SLDataType num) 接口的实现细节2.2.6、SLErase(SL* ps, int pos) 接口的实现细节2.2.7、SLFind(SL* ps, SLDataType x) 接口的实现细节三、测试和总结1、测试1.1、添加数据1.2、删除数据1.3、查找数据2、总结一、顺序表的定义1、顺序表的概念及结构1.1线性表线性表linear list是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结 构常见的线性表顺序表、链表、栈、队列、字符串等。线性表在逻辑上是线性结构也就说是连续的一条直线。但是在物理结构上并不一定是连续的线性表在物 理上存储时通常以数组和链式结构的形式存储。2、顺序表概念和分类顺序表的概念顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构一般情况下采用数组存储。在数组 上完成数据的增删查改。2.1 静态顺序表概念使用定长数组存储元素。静态顺序表缺陷空间给少了不够用给多了就会造成空间浪费的现象。静态顺序表代码如下//静态顺序表代码 //这里将存储的类型变为 SLDataType 是为了方便以后修改使用不同的数据类型 typedef int SLDataType; #define N 100;//这里将数组存储的数据容量设置为 N 是为了方便以后修改容量 typedef struct SeqList { SLDatatype arr[N]; int size;//size是有效数据的个数 }SL;2.2 动态顺序表概念使用动态开辟的数组存储。接下来我们以动态顺序表代码为例来进行讲解。二、动态顺序表的实现1、创建文件按照图中的样式来创建文件解释一下创建这三个文件的作用 1、头文件SeqList.h是用来声明接口函数定义顺序表将几个公共用到的库函数集合起来 2、源文件SeqList.c是用来完善接口里面的细节 3、源文件test.c是用于接口的测试工作 即具体的使用场景2、顺序表的实现2.1、创建顺序表首先在SeqList.h里定义顺序表的结构和功能#pragma once #includestdio.h #includestdlib.h #includeassert.h typedef int SLDataType; typedef struct Seqlist { SLDataType* a; int size; //有效数据个数 int capacity; //空间容量 }SL; //增删查改 void SLInit(SL* ps);//初始化顺表表里面的数据 void SLDestroy(SL* ps);//销毁顺序表 void SLPrint(SL* ps);//打印存储在顺序表里面的数据 void SLCheckCapacity(SL* ps);//检查当前容量是否满了满了的话就进行扩容 void SLInsert(SL* ps, int pos, SLDataType num);//往顺寻表里面某一位置插入数据 void SLErase(SL* ps, int pos);//删除顺序表里面某一位置的数据 int SLFind(SL* ps, SLDataType x);//查找顺寻表里面某一个数据的下标2.2、实现接口里面的功能2.2.1、SLInit(SL* ps)接口的实现细节//初始化里面的数据 void SLInit(SL* ps) { ps-a NULL; // 刚初始化时不分配内存指向空 ps-size 0; // 有效数据个数为0 ps-capacity 0; // 容量为0 }2.2.2、SLDestroy(SL* ps)接口的实现细节//销毁顺序表 void SLDestroy(SL* ps) { //判断当前传的值是否为空指针 assert(ps); //释放申请的空间 free(ps-a); //将指针初始化为空指针防止变为“野指针”。 ps-a NULL; ps-capacity ps-size 0; }2.2.3、SLPrint(SL* ps)接口的实现细节//打印存储在顺序表里面的数据 void SLPrint(SL* ps) { for (int i 0; i ps-size; i) { printf(%d , ps-a[i]); } printf(\n); }2.2.4、SLCheckCapacity(SL* ps)接口的实现细节//检查当前容量是否满了满了的话就进行扩容 void SLCheckCapacity(SL* ps) { if (ps-size ps-capacity) { //sizeof(SLDataType) * ps-capacity * 2 意思是将目前的容量扩大2倍 //sizeof(SLDataType) 判断当前类型是多少字节 //ps-capacity 当前的容量是多少 SLDataType* tmp (SLDataType*)realloc(ps-a, sizeof(SLDataType) * ps-capacity * 2); if (tmp NULL) { perror(realloc); return; } //指向新开辟的内存空间 ps-a tmp; //因为改变的内存的值不会影响到这里容量的值所以需要我们手动改为原来的2倍 ps-capacity * 2; } }2.2.5、SLInsert(SL* ps, int pos, SLDataType num)接口的实现细节//往顺寻表里面某一位置插入数据 void SLInsert(SL* ps, int pos, SLDataType num) { //判断传来的数据是否合理 assert(ps); assert(pos 0 pos ps-size); //检查当前的容量是否足够 SLCheckCapacity(ps); //插入数据将具体的值放入对应的下标那里。 //插入数据逻辑是需要将 插入数据 位置后面的数据往后面移动那我们只需要定位到 //顺序表最后一个位置就好了(指的是ps-size当前的长度)然后从后面一个个进行移动所以检查容量的这个过程。 //必须在移动数据这个操作前进行。 for (int i ps-size; i pos; i--) { ps-a[i] ps-a[i - 1]; } //移动完毕之后将这个下标对应的值赋值给要插入的数据的值 ps-a[pos] num; //有效数据 1; (这里面的有效数据指当前有多少值放在这个顺序表里面) ps-size; }2.2.6、SLErase(SL* ps, int pos)接口的实现细节//删除顺序表里面某一位置的数据 void SLErase(SL* ps, int pos) { //判断传来的数据是否合理 assert(ps); assert(pos 0 pos ps-size); //删除数据的逻辑和添加数据的逻辑类似 //只不过添加数据是从最后一个位置往后面移动 //而删除数据则是从删除的位置的下标开始将后面的数据往前面进行移动 //pos -- 代表的就是你传来的下标 for (int i pos; i ps-size - 1; i) { ps-a[i] ps-a[i 1]; } //之后有效数据 -1(这里面的有效数据指当前有多少值放在这个顺序表里面) ps-size--; }2.2.7、SLFind(SL* ps, SLDataType x)接口的实现细节//查找顺寻表里面某一个数据的下标 int SLFind(SL* ps, SLDataType x) { assert(ps); for (int i 0; i ps-size; i) { if (ps-a[i] x) { //找到了就返回它的下标 return i; } } //没找到就返回 -1 return -1; }三、测试和总结1、测试1.1、添加数据测试代码#includeseqList.h int main() { //创建变量 SL s; //先初始化数据 SLInit(s); //警告插入数据的时候必须要连续存储不能跳着插入不然引发报错 //因为顺序表要求数据从下标0开始连续存储所以插入位置只能是 [0, size] 闭区间 //不能跳着插入这就是为什么在 SLInsert 函数中必须加 assert(pos 0 pos ps-size) //来防止这种错误操作。 SLInsert(s, 0, 1); SLInsert(s, 1, 2); SLInsert(s, 2, 3); SLInsert(s, 3, 4); SLInsert(s, 4, 5); SLInsert(s, 5, 6); SLPrint(s); return 0; }测试结果1.2、删除数据测试代码#includeseqList.h int main() { //创建变量 SL s; //先初始化数据 SLInit(s); //添加数据 SLInsert(s, 0, 1); SLInsert(s, 1, 2); SLInsert(s, 2, 3); SLInsert(s, 3, 4); SLInsert(s, 4, 5); SLInsert(s, 5, 6); SLPrint(s); //删除数据 SLErase(s, 4); SLErase(s, 0); SLPrint(s); return 0; }测试结果1.3、查找数据测试代码#includeseqList.h int main() { //创建变量 SL s; //先初始化数据 SLInit(s); SLInsert(s, 0, 1); SLInsert(s, 1, 2); SLInsert(s, 2, 3); SLInsert(s, 3, 4); SLInsert(s, 4, 5); SLInsert(s, 5, 6); SLPrint(s); SLErase(s, 4); SLErase(s, 0); SLPrint(s); //查找值对应的下标 int res SLFind(s, 4); printf(对应的下标值为%d, res); return 0; }测试结果2、总结以上便是我对顺序表部分的全部理解了。有啥不好的地方也欢迎大家积极指出建议大家理解这部分内容的时候可以多多画图方便理解。希望大家早日被自己喜欢的offer录取。那我们就下一个博客见。

相关新闻

四柱精密伺服冲床:高精度、高刚性、高节能的智能冲压解决方案

四柱精密伺服冲床:高精度、高刚性、高节能的智能冲压解决方案

在金属冲压成型领域,冲压设备的精度、刚性和能耗水平直接影响产品的质量和生产成本。传统机械冲床依赖飞轮储能和离合器制动机构,运动曲线固定、能耗高、精度受机械磨损影响大,已难以满足新能源汽车、精密电子、家电制造等行业对高精度、高效…

2026/7/18 18:13:52阅读更多 →
LLMOps落地实践:Python驱动的模型部署与链路优化

LLMOps落地实践:Python驱动的模型部署与链路优化

一、从Notebook到生产:大模型部署的“最后一公里” 把大模型从实验环境搬到生产环境,这个看似简单的“最后一步”,往往是整个项目中最耗时、最磨人的环节。模型在Jupyter里跑得再好,一旦面临真实流量的冲击——并发请求、延迟要求…

2026/7/18 18:13:52阅读更多 →
研究生的第一篇sci一定要学会“抄”

研究生的第一篇sci一定要学会“抄”

哈喽大家好,我是两年发了八篇SCI的博三学长。第一篇SCI,到底该不该“抄”? 好多师弟师妹刚开始写论文,觉得借鉴别人非常别扭,还担心学术诚信问题。我研一那会儿也这么想,结果憋了几个月,一个字都…

2026/7/18 18:11:52阅读更多 →
差分时钟原理与高速数字系统设计实践

差分时钟原理与高速数字系统设计实践

1. 差分时钟的基本概念与工作原理在高速数字系统中,时钟信号的质量直接决定了整个系统的稳定性和性能。差分时钟作为一种特殊的信号传输方式,由两根相位相反的信号线组成(通常标记为CLK和CLK-),通过两根线之间的电压差…

2026/7/18 19:09:56阅读更多 →
终极指南:如何在Android应用中快速集成Jetpack Media3与Compose实现现代化媒体播放

终极指南:如何在Android应用中快速集成Jetpack Media3与Compose实现现代化媒体播放

终极指南:如何在Android应用中快速集成Jetpack Media3与Compose实现现代化媒体播放 【免费下载链接】media Jetpack Media3 support libraries for media use cases, including ExoPlayer, an extensible media player for Android 项目地址: https://gitcode.com…

2026/7/18 19:09:56阅读更多 →
半导体光刻胶关键参数解析与工艺优化

半导体光刻胶关键参数解析与工艺优化

1. 光刻胶基础特性解析光刻胶作为半导体制造中的关键材料,其性能参数直接影响着光刻工艺的成败。在28nm以下制程中,胶厚偏差超过5nm就会导致图形转移失效。我们实验室曾遇到一个典型案例:某批次KrF光刻胶的粘度波动导致线宽均匀性超标&#x…

2026/7/18 19:09:56阅读更多 →
树莓派操作系统Trixie升级指南与兼容性解决方案

树莓派操作系统Trixie升级指南与兼容性解决方案

1. 树莓派操作系统升级的必要性与挑战2026年,树莓派操作系统迎来了代号为Trixie的重大版本更新。作为从Bookworm版本升级的里程碑式跨越,这次升级带来了诸多底层架构改进和功能增强。但官方论坛中大量用户反馈的兼容性问题表明,直接升级存在显…

2026/7/18 19:09:56阅读更多 →
代理IP选购技术评测:不同预算档位的延迟/并发/可用率实测对比

代理IP选购技术评测:不同预算档位的延迟/并发/可用率实测对比

做爬虫的同行应该都有过这种经历——花了几百块买了一批代理IP,跑起来一看,延迟爆炸、成功率感人,还不如自己挂个免费代理。问题出在哪?不是代理IP没用,而是你没有根据实际需求选择正确的档位和类型。本文从技术角度出…

2026/7/18 19:09:56阅读更多 →
电子信息工程毕业别乱投!硬件、通信、软件、数据四大赛道怎么选

电子信息工程毕业别乱投!硬件、通信、软件、数据四大赛道怎么选

现在大三、大四电子信息工程的同学投实习全在迷茫:硬件越老越吃香吗、通信行业是不是走下坡、软件起薪高但内卷严重、数据岗适配度到底怎么样,我本硕电子信息工程,身边三十多个同学分去四条赛道踩过不少坑,今天给大家掰开拆解四大…

2026/7/18 19:07:56阅读更多 →
VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异当你在VSCode中启动一个新的TypeScript项目时,第一个技术决策往往从安装方式开始。这个看似简单的选择——全局安装还是项目本地安装——实际上会深刻影响你的开发流程、团队协作和…

2026/7/18 10:49:13阅读更多 →
智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 智慧树刷课插件是一款专为智慧树在线教育平台设计的Chrome浏…

2026/7/18 8:49:08阅读更多 →
Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你是否在GOG或Epic Games Store购买了心仪的游戏…

2026/7/18 14:49:24阅读更多 →
从模糊意图到可执行指令:Claude PRD中Prompt Engineering与需求颗粒度的5级映射法则

从模糊意图到可执行指令:Claude PRD中Prompt Engineering与需求颗粒度的5级映射法则

更多请点击: https://kaifayun.com 第一章:从模糊意图到可执行指令:Claude PRD中Prompt Engineering与需求颗粒度的5级映射法则 在Claude驱动的产品需求文档(PRD)生成实践中,原始业务意图往往以自然语言片…

2026/7/18 0:00:14阅读更多 →
Cursor配置生成失效?3大隐藏陷阱+4行修复代码,资深工程师连夜整理的紧急补救清单

Cursor配置生成失效?3大隐藏陷阱+4行修复代码,资深工程师连夜整理的紧急补救清单

更多请点击: https://codechina.net 第一章:Cursor配置生成失效?3大隐藏陷阱4行修复代码,资深工程师连夜整理的紧急补救清单 Cursor 配置生成突然失效,是近期高频报障场景。表面看是 cursor.config.json 未更新或 LSP…

2026/7/18 0:00:14阅读更多 →
某智驾大牛创业

某智驾大牛创业

作者:钟声编辑:Mark出品:红色星际头图:智能驾驶图片据悉,国内某头部智驾公司端到端模型技术大牛Z投身创业,并且已经拿到融资。Z不仅是该头部公司内部最年轻的对标阿里P10级别技术负责⼈,更是业内…

2026/7/18 0:00:14阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/17 22:48:46阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/18 14:49:24阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/18 18:49:35阅读更多 →