第31篇 数据结构入门:顺序表

发布时间:2026/8/30 8:25:56

第31篇 数据结构入门:顺序表
数据结构入门顺序表与链表的深度解析在编程的世界里如何高效地存储和管理数据是核心问题。线性表Linear List作为最基础、最常用的数据结构是我们必须掌握的第一课。线性表在逻辑上是一条连续的直线但在物理存储上却分为两大流派顺序表和链表。今天我们就来深入剖析顺序表。文章目录1. 静态顺序表 vs 动态顺序表第一部分顺序表代码实现1. 项目文件划分2. 类型重定义与结构体优化3. 初始化与扩容机制4. 增删改查接口实现第二部分LeetCode 经典例题实战1. 移除元素 (LeetCode 27)2. 删除有序数组中的重复项 (LeetCode 26)3. 合并两个有序数组 (LeetCode 88)3. 顺序表的痛点与展望什么是顺序表顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构。简单来说它的底层就是数组。你可以把它想象成一家米其林餐厅数组就像是原材料比如炒西蓝花。顺序表则是对数组进行了封装增加了“摆盘”和“服务”即增删改查接口变成了一道精致的菜比如绿野仙踪。1. 静态顺序表 vs 动态顺序表静态顺序表使用定长数组存储。缺陷在于空间给少了不够用给多了造成浪费不够灵活。动态顺序表按需申请空间。这是我们在实际开发中更常用的形式。它包含三个核心要素a指向数据的指针。size当前有效数据的个数。capacity当前空间的总容量。// 动态顺序表结构体定义typedefstructSeqList{SLDataType*a;// 指向动态开辟的数组intsize;// 有效数据个数intcapacity;// 空间容量}SL;正如前文所述顺序表是对数组进行了封装增加了增删改查的接口。接下来我们就来一步步实现这些功能。第一部分顺序表代码实现1. 项目文件划分为了方便管理和维护我们将代码分为三个文件SL.h公共接口声明函数、定义结构体。SL.c具体实现#include SL.h编写函数体。test.c测试逻辑#include SL.h调用函数进行验证。2. 类型重定义与结构体优化为了避免后续修改数据类型时产生大量冗余工作我们使用typedef对数据类型和结构体进行重命名。// 将元素类型重命名方便后续统一修改typedefintSLDataType;// 动态顺序表结构体定义typedefstructSeqList{SLDataType*a;// 指向动态开辟的数组intsize;// 有效数据个数intcapacity;// 空间容量}SL;3. 初始化与扩容机制由于后续操作需要修改结构体内部的数据因此传参一律采用传址调用指针。同时为了防范野指针我们引入assert.h进行断言检查。初始化函数voidSLinit(SL*ps){assert(ps);ps-aNULL;ps-size0;ps-capacity0;}扩容函数每次进行插入操作前都需要检查空间是否充足。扩容策略为若初始容量为0则默认开辟4个空间否则扩大为原来的2倍。同时必须妥善处理realloc可能返回NULL的隐患防止原数据丢失。voidSLdilat(SL*p){assert(p);intnewcapacity(p-capacity0?4:p-capacity*2);// 使用临时指针接收 realloc 的返回值防止扩容失败导致原指针丢失SLDataType*tmp(SLDataType*)realloc(p-a,newcapacity*sizeof(SLDataType));if(tmpNULL){perror(realloc fail : );return;}p-atmp;p-capacitynewcapacity;}4. 增删改查接口实现尾部增加元素voidSLtailadd(SL*p,SLDataType x){assert(p);if(p-sizep-capacity){SLdilat(p);}p-a[p-size]x;// 后置使得代码更加简洁美观}尾部删除元素删除操作只需将有效数据个数size减 1 即可无需真正清除内存中的数据。voidSLtaildel(SL*p){assert(p);if(p-size0)return;p-size--;}头部增加元素需要将原有数据整体向后挪动一位再在首位置赋值。voidSLheadadd(SL*p,SLDataType x){assert(p);if(p-sizep-capacity){SLdilat(p);}for(intip-size;i0;i--){p-a[i]p-a[i-1];}p-a[0]x;p-size;}头部删除元素将第二个元素开始的数据依次向前覆盖最后更新size。voidSLheaddel(SL*p){assert(p);if(p-size0)return;for(inti0;ip-size-1;i){p-a[i]p-a[i1];}p-size--;}查找指定数据遍历数组寻找目标数据找到返回其索引找不到返回 -1。intSLfind(SL*p,SLDataType x){assert(p);for(inti0;ip-size;i){if(p-a[i]x)returni;}return-1;}在指定位置前插入数据结合查找函数先定位索引再将目标位置及之后的数据整体后移。voidSLfixadd(SL*p,SLDataType x,intpos){assert(p);if(p-sizep-capacity){SLdilat(p);}for(intip-size;ipos;i--){p-a[i]p-a[i-1];}p-a[pos]x;p-size;}打印函数用于测试voidSLprint(SL*p){assert(p);for(inti0;ip-size;i){printf(%d\t,p-a[i]);}printf(\nsize: %d\tcapacity: %d\n,p-size,p-capacity);}测试代码示例#includeSL.hintmain(){SL s;SLinit(s);SLtailadd(s,8);SLprint(s);SLheadadd(s,6);SLprint(s);printf(请输入你指定的数字);SLDataType i;scanf(%d,i);intposSLfind(s,i);if(pos-1){printf(你提供的数值不在该顺序表里面\n);}else{printf(请输入你想要插入的数字);SLDataType j;scanf(%d,j);SLfixadd(s,j,pos);SLprint(s);}return0;}第二部分LeetCode 经典例题实战掌握了顺序表的基础操作后我们通过三道经典题目来巩固“双指针法”这一核心思想。1. 移除元素 (LeetCode 27)思路使用快慢双指针。sou指针负责遍历数组当遇到不等于val的值时将其赋值给des指针指向的位置然后des后移。最终des与起始位置的差值即为新数组的长度。intremoveElement(int*nums,intnumsSize,intval){int*sounums;int*desnums;for(inti0;inumsSize;i){if(*sou!val){*des*sou;des;}sou;}returndes-nums;}2. 删除有序数组中的重复项 (LeetCode 26)思路同样使用双指针。des初始在首位sou从第二位开始遍历。当sou指向的值与des不同时des先自增再接收sou的值。注意由于是先自增再赋值最终返回的长度需要des - nums 1或者在循环外处理。intremoveDuplicates(int*nums,intnumsSize){if(numsSize0)return0;int*desnums;int*sounums1;for(inti1;inumsSize;i){if(*sou!*des){des;*des*sou;}sou;}returndes-nums1;}3. 合并两个有序数组 (LeetCode 88)思路为了避免从头开始比较带来的数据搬移开销我们采用“逆向双指针”法。从两个数组的有效尾部开始比较将较大的元素放到nums1的最终尾部依次向前填充。voidmerge(int*nums1,intnums1Size,intm,int*nums2,intnums2Size,intn){intendnums1Size-1;while(m0n0){if(nums1[m-1]nums2[n-1]){nums1[end--]nums1[m-1];m--;}else{nums1[end--]nums2[n-1];n--;}}// 如果 nums2 还有剩余直接拷贝到 nums1 前面while(n0){nums1[end--]nums2[n-1];n--;}}3. 顺序表的痛点与展望虽然顺序表支持随机访问下标访问时间复杂度O ( 1 ) O(1)O(1)但它也有明显的短板头部/中间插入删除效率低需要搬移大量数据时间复杂度为O ( N ) O(N)O(N)。扩容成本高当空间不足时需要申请新空间、拷贝数据、释放旧空间。空间浪费扩容通常呈2倍增长如果插入少量数据后不再操作剩余空间会被白白浪费。那么有没有办法解决这些痛点呢有的这就需要用到链表了。不过那就是我们下一篇博客要探讨的内容了敬请期待

相关新闻

如何完整备份微信聊天记录:WeChatMsg数据自主管理实用指南

如何完整备份微信聊天记录:WeChatMsg数据自主管理实用指南

2026/8/25 19:03:53

如何完整备份微信聊天记录:WeChatMsg数据自主管理实用指南 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/W…

Supabase 数据库介绍:开源 Firebase 替代方案

Supabase 数据库介绍:开源 Firebase 替代方案

2026/8/28 11:34:00

1. 什么是 Supabase?Supabase 是一个开源的 Firebase 替代方案,提供了一套完整的后端即服务(BaaS)解决方案。它基于 PostgreSQL 数据库构建,并提供了实时订阅、身份验证、存储、函数等丰富的功能。Supabase 的核心目标…

【HarmonyOS NEXT】error: failed to install bundle. code:9568322...

【HarmonyOS NEXT】error: failed to install bundle. code:9568322...

2026/8/26 16:22:15

🎯 核心原因一:手动签名配置了发布证书(Release Profile)这是最常见的原因之一。发布证书签名的应用,无法直接通过hdc命令安装到真机进行调试。现象:你按照文档配置了生产环境的Profile,设备也添…

基于MAPPO的多无人机三维编队避障:从强化学习原理到PyBullet仿真实践

基于MAPPO的多无人机三维编队避障:从强化学习原理到PyBullet仿真实践

2026/8/30 8:21:43

简介:本资源是一套面向本科毕业设计与人工智能课程实践的多无人机三维协同控制方案,聚焦于复杂动态环境下多机编队保持与实时避障两大核心挑战,采用深度强化学习前沿算法MAPPO实现分布式智能决策。压缩包共6个文件(4个Python脚本、…

三端影视源码实战:基于苹果CMS的自动采集建站与App封装指南

三端影视源码实战:基于苹果CMS的自动采集建站与App封装指南

2026/8/30 8:21:43

简介:这是一套基于苹果CMS开发的三端(PC手机H5App)影视网站源码,面向影视站长、PHP初中级开发者及个人建站爱好者,解决快速搭建自动采集电影电视剧网站的核心需求。资源包共2000个文件,含671个PHP后端逻辑文…

从源码到运营级直播打赏系统:架构、支付安全与高并发实战

从源码到运营级直播打赏系统:架构、支付安全与高并发实战

2026/8/30 8:21:43

简介:这是一套面向Web开发者与平台运营人员的实战型学习资源,聚焦在线打赏系统的设计与支付集成,尤其适用于内容平台、直播社区等需高并发打赏能力的场景。资源包含完整可运行的运营级打赏程序源码及配套视频教程,覆盖环境部署、支…

从1亿到450亿:AI算力军备竞赛背后的技术逻辑与风险启示

从1亿到450亿:AI算力军备竞赛背后的技术逻辑与风险启示

2026/8/30 8:21:43

在科技投资领域,很少有人能像 Leopold Aschenbrenner 这样,把“技术判断”和“巨额资金”绑得如此紧密。一则关于他管理的资金从 1 亿美元增长到 450 亿美元、同时又“几乎爆仓”的讨论,最近在技术圈反复被提起。这件事之所以值得技术人关注&…

MiniMind 医疗 LoRA 微调实战:2 小时 3 元训出 64M 垂直医疗助手

MiniMind 医疗 LoRA 微调实战:2 小时 3 元训出 64M 垂直医疗助手

2026/8/30 8:21:43

MiniMind 医疗 LoRA 微调实战:2 小时 3 元训出 64M 垂直医疗助手 【免费下载链接】minimind 🧠 Train a 64M-parameter LLM from scratch in just 2h! 项目地址: https://gitcode.com/GitHub_Trending/min/minimind 周一上午九点,社区…

电影票房大数据分析全链路:Python爬虫+Spark+可视化

电影票房大数据分析全链路:Python爬虫+Spark+可视化

2026/8/30 8:11:43

在大数据毕业设计中,电影票房数据分析与可视化属于典型的“数据采集 -> 数据存储 -> 数据清洗 -> 数据分析 -> 可视化展示”全链路项目。它覆盖了 Python 爬虫、Hadoop HDFS、Spark SQL、数据库设计和前端图表展示等多个环节,既能体现工程能…

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

2026/8/30 0:01:07

每年校招季我都会接触不少准备数据库方向笔试的同学,看到最多的状态就是:简历上写着“熟悉 MySQL”“了解索引优化”,一碰到数据库管理工程师的笔试卷,却在索引、事务、锁、备份恢复这些题目上翻车。网易这套 2018 校园招聘数据库…

数字电路时序基石:深入理解建立时间与保持时间

数字电路时序基石:深入理解建立时间与保持时间

2026/8/30 0:01:07

1. 这不是“背公式”的事:时间参数到底在约束什么你翻过数字电路教材,一定见过这两个词:建立时间(Setup Time)和保持时间(Hold Time)。它们常被并列写在触发器(Flip-Flop&#xff09…

蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

2026/8/30 0:01:07

1. 项目缘起:从赛题到超声波测距机的诞生第八届蓝桥杯单片机设计与开发国赛的题目,我至今记忆犹新。它没有直接给出一个花哨的名字,而是用“超声波测距机”这个朴实无华的功能描述,精准地勾勒出了考核的核心。对于当时备赛的我而言…

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

2026/8/30 0:01:07

每年校招季我都会接触不少准备数据库方向笔试的同学,看到最多的状态就是:简历上写着“熟悉 MySQL”“了解索引优化”,一碰到数据库管理工程师的笔试卷,却在索引、事务、锁、备份恢复这些题目上翻车。网易这套 2018 校园招聘数据库…

数字电路时序基石:深入理解建立时间与保持时间

数字电路时序基石:深入理解建立时间与保持时间

2026/8/30 0:01:07

1. 这不是“背公式”的事:时间参数到底在约束什么你翻过数字电路教材,一定见过这两个词:建立时间(Setup Time)和保持时间(Hold Time)。它们常被并列写在触发器(Flip-Flop&#xff09…

蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

2026/8/30 0:01:07

1. 项目缘起:从赛题到超声波测距机的诞生第八届蓝桥杯单片机设计与开发国赛的题目,我至今记忆犹新。它没有直接给出一个花哨的名字,而是用“超声波测距机”这个朴实无华的功能描述,精准地勾勒出了考核的核心。对于当时备赛的我而言…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/28 7:35:26

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/28 7:34:51

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/28 7:34:35

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…