当前位置: 首页 > article >正文

【数据结构与算法】第5篇:线性表(一):顺序表(ArrayList)的实现与应用

一、什么是顺序表顺序表是最简单的一种线性结构。用一段地址连续的存储单元依次存储数据元素。你可以把它理解为一个可以自动扩容的数组。C语言的原生数组长度是固定的不够用的时候只能重新申请更大的数组把数据搬过去。顺序表封装了这个过程让使用者不用操心容量问题。顺序表的特点逻辑上相邻的元素物理位置上也相邻可以通过下标直接访问时间复杂度O(1)插入和删除操作需要移动元素时间复杂度O(n)二、顺序表的结构定义我们需要用一个结构体来管理顺序表ctypedef struct { int *data; // 指向动态数组的指针 int size; // 当前元素个数 int capacity; // 总容量 } SeqList;data指向一块连续内存的指针真正存数据的地方size当前有多少个元素capacity当前最多能存多少个元素不一定是内存的实际字节数三、基本操作实现3.1 初始化cvoid initSeqList(SeqList *list, int initCapacity) { list-data (int*)malloc(initCapacity * sizeof(int)); if (list-data NULL) { printf(初始化失败\n); exit(1); } list-size 0; list-capacity initCapacity; }初始化时先申请一块内存size设为0capacity就是申请的大小。3.2 销毁cvoid destroySeqList(SeqList *list) { if (list-data ! NULL) { free(list-data); list-data NULL; } list-size 0; list-capacity 0; }用完一定要释放内存避免泄漏。3.3 扩容扩容是顺序表的核心。当size等于capacity时再插入新元素就需要扩容。cvoid expand(SeqList *list) { int newCapacity list-capacity * 2; // 翻倍扩容 int *newData (int*)realloc(list-data, newCapacity * sizeof(int)); if (newData NULL) { printf(扩容失败\n); return; } list-data newData; list-capacity newCapacity; printf(扩容到 %d\n, newCapacity); }扩容策略这里用的是翻倍扩容。也可以每次增加固定大小比如10。翻倍扩容的优点是随着容量变大扩容次数越来越少平均时间复杂度更低。3.4 插入在指定位置插入元素这是顺序表最复杂的操作。cint insert(SeqList *list, int pos, int value) { // 检查位置是否合法可以插在末尾所以pos可以从0到size if (pos 0 || pos list-size) { printf(插入位置不合法\n); return -1; } // 满了就扩容 if (list-size list-capacity) { expand(list); } // 移动元素从最后一个开始往后移给新元素腾位置 for (int i list-size; i pos; i--) { list-data[i] list-data[i - 1]; } // 插入新元素 list-data[pos] value; list-size; return 0; }关键点移动元素必须从后往前移。如果从前往后移前面的元素会把后面的覆盖掉。画个图理解一下在位置2插入一个元素text插入前[10, 20, 30, 40] size4 插入位置2值25 第一步从最后一个开始往后移 [10, 20, 30, 40, 40] i从4移到3 [10, 20, 30, 30, 40] i移到2时停止 第二步插入 [10, 20, 25, 30, 40] size变成53.5 删除删除指定位置的元素同样需要移动数据。cint delete(SeqList *list, int pos) { // 检查位置是否合法 if (pos 0 || pos list-size) { printf(删除位置不合法\n); return -1; } // 保存被删除的值如果需要的话 int value list-data[pos]; // 移动元素从pos1开始往前移 for (int i pos; i list-size - 1; i) { list-data[i] list-data[i 1]; } list-size--; return value; }删除比插入简单移动方向是从前往后。3.6 查找按值查找返回第一个匹配的位置。cint find(SeqList *list, int value) { for (int i 0; i list-size; i) { if (list-data[i] value) { return i; } } return -1; }3.7 打印cvoid print(SeqList *list) { printf(size%d, capacity%d, [, list-size, list-capacity); for (int i 0; i list-size; i) { printf(%d, list-data[i]); if (i list-size - 1) printf(, ); } printf(]\n); }四、完整代码演示c#include stdio.h #include stdlib.h typedef struct { int *data; int size; int capacity; } SeqList; void initSeqList(SeqList *list, int initCapacity) { list-data (int*)malloc(initCapacity * sizeof(int)); if (list-data NULL) { printf(初始化失败\n); exit(1); } list-size 0; list-capacity initCapacity; } void destroySeqList(SeqList *list) { if (list-data ! NULL) { free(list-data); list-data NULL; } list-size 0; list-capacity 0; } void expand(SeqList *list) { int newCapacity list-capacity * 2; int *newData (int*)realloc(list-data, newCapacity * sizeof(int)); if (newData NULL) { printf(扩容失败\n); return; } list-data newData; list-capacity newCapacity; printf(扩容到 %d\n, newCapacity); } int insert(SeqList *list, int pos, int value) { if (pos 0 || pos list-size) { printf(插入位置不合法\n); return -1; } if (list-size list-capacity) { expand(list); } for (int i list-size; i pos; i--) { list-data[i] list-data[i - 1]; } list-data[pos] value; list-size; return 0; } int delete(SeqList *list, int pos) { if (pos 0 || pos list-size) { printf(删除位置不合法\n); return -1; } int value list-data[pos]; for (int i pos; i list-size - 1; i) { list-data[i] list-data[i 1]; } list-size--; return value; } int find(SeqList *list, int value) { for (int i 0; i list-size; i) { if (list-data[i] value) { return i; } } return -1; } void print(SeqList *list) { printf(size%d, capacity%d, [, list-size, list-capacity); for (int i 0; i list-size; i) { printf(%d, list-data[i]); if (i list-size - 1) printf(, ); } printf(]\n); } int main() { SeqList list; initSeqList(list, 3); // 插入几个元素观察扩容 insert(list, 0, 10); insert(list, 1, 20); insert(list, 2, 30); print(list); // 再插一个触发扩容 insert(list, 3, 40); print(list); // 中间插入 insert(list, 2, 25); print(list); // 删除 int val delete(list, 2); printf(删除的值: %d\n, val); print(list); // 查找 int pos find(list, 30); printf(30的位置: %d\n, pos); destroySeqList(list); return 0; }运行结果text扩容到 6 size3, capacity3, [10, 20, 30] size4, capacity6, [10, 20, 30, 40] size5, capacity6, [10, 20, 25, 30, 40] 删除的值: 25 size4, capacity6, [10, 20, 30, 40] 30的位置: 2五、复杂度分析操作时间复杂度说明按索引访问O(1)直接通过下标计算地址插入O(n)平均移动n/2个元素删除O(n)平均移动n/2个元素查找按值O(n)最坏情况遍历全部扩容均摊O(1)翻倍扩容平均每次插入的扩容成本很低关于扩容的均摊分析假设初始容量为1翻倍扩容到n的过程中总共移动的次数约为2n平均到n次插入每次插入的扩容成本是O(1)。六、顺序表的优缺点优点支持随机访问按下标取元素是O(1)空间连续CPU缓存友好尾插尾删效率高不需要移动元素缺点中间插入和删除需要移动大量元素效率低扩容时需要重新申请内存并拷贝数据有开销可能浪费空间capacity size的部分适用场景需要频繁随机访问主要在尾部操作元素个数大致可预估七、小结这一篇我们实现了顺序表要点总结要点说明结构data指针 size capacity扩容realloc实现翻倍扩容策略插入从后往前移动元素删除从前往后移动元素复杂度随机访问O(1)插入删除O(n)下一篇我们会讲单链表它解决了顺序表插入删除慢的问题但失去了随机访问的能力。没有完美的数据结构只有合适的选择。八、思考题如果每次扩容只增加10个位置而不是翻倍会有什么问题插入操作中如果插入位置是末尾还需要移动元素吗写一个函数删除顺序表中所有等于某个值的元素要求时间复杂度O(n)。为什么顺序表不适合在头部频繁插入欢迎在评论区讨论你的答案。

相关文章:

【数据结构与算法】第5篇:线性表(一):顺序表(ArrayList)的实现与应用

一、什么是顺序表顺序表是最简单的一种线性结构。用一段地址连续的存储单元依次存储数据元素。你可以把它理解为一个可以自动扩容的数组。C语言的原生数组长度是固定的,不够用的时候只能重新申请更大的数组,把数据搬过去。顺序表封装了这个过程&#xff…...

告别WSL1!手把手教你将WSL升级到WSL2,并更新Linux内核到最新版(2024保姆级教程)

2024终极指南:从WSL1无缝迁移至WSL2并升级Linux内核 如果你还在使用WSL1,可能会遇到Docker运行缓慢、文件系统操作卡顿等问题。WSL2带来了完整的Linux内核支持,性能提升显著。本文将带你完成从WSL1到WSL2的完整迁移,并确保你的Li…...

RT-Thread线程管理与调度机制详解

RT-Thread线程管理深度解析1. 嵌入式实时操作系统中的线程概念在嵌入式实时操作系统(RTOS)中,线程是最基本的调度单位,也被称为任务。与裸机编程的单线程模式不同,RTOS通过多线程机制实现了任务的并发执行。裸机系统通常采用一个无限循环结构…...

Chat模型微调实战:基于AI辅助开发的高效调参指南

最近在做一个智能客服项目,需要基于一个预训练的Chat模型进行微调,以适应我们特定的业务对话场景。一开始,我天真地以为微调就是改改学习率、跑几轮训练那么简单,结果很快就陷入了“调参地狱”。手动调整超参数不仅耗时&#xff0…...

从物流仓库到游戏背包:三维装箱问题(3D-BPP)如何影响你的日常生活?

从物流仓库到游戏背包:三维装箱问题如何塑造我们的数字生活 清晨打开手机里的策略游戏,你发现背包格子又不够用了——那些珍贵的装备和药水总是无法完美摆放;周末搬家时,面对满屋的家具和纸箱,你突然意识到小货车可能装…...

3步实现游戏ROM高效管理:RomM自托管解决方案完整指南

3步实现游戏ROM高效管理:RomM自托管解决方案完整指南 【免费下载链接】romm A beautiful, powerful, self-hosted rom manager 项目地址: https://gitcode.com/GitHub_Trending/rom/romm 游戏ROM管理是每位怀旧游戏爱好者的必修课,但面对成千上万…...

Virtual-Display-Driver终极指南:Windows虚拟显示器驱动完整配置与优化教程

Virtual-Display-Driver终极指南:Windows虚拟显示器驱动完整配置与优化教程 【免费下载链接】Virtual-Display-Driver Add virtual monitors to your windows 10/11 device! Works with VR, OBS, Sunshine, and/or any desktop sharing software. 项目地址: https…...

HMC5883L地磁传感器驱动开发与AHRS融合实战

1. HMC5883L地磁传感器技术深度解析与嵌入式驱动开发实践 1.1 器件定位与工程价值 HMC5883L是由Honeywell(霍尼韦尔)推出的三轴数字地磁罗盘传感器,采用各向异性磁阻(AMR)技术,专为高精度电子罗盘、姿态检…...

RuoYi-Vue-Plus:现代化企业级开发框架的架构演进与分布式多租户解决方案

RuoYi-Vue-Plus:现代化企业级开发框架的架构演进与分布式多租户解决方案 【免费下载链接】RuoYi-Vue-Plus 项目地址: https://gitcode.com/GitHub_Trending/ru/RuoYi-Vue-Plus 面对企业应用开发中普遍存在的分布式架构复杂性、多租户数据隔离难题以及传统框…...

Folo信息整理神器:如何告别碎片化阅读,轻松构建专属知识库?

Folo信息整理神器:如何告别碎片化阅读,轻松构建专属知识库? 【免费下载链接】follow [WIP] Next generation information browser 项目地址: https://gitcode.com/GitHub_Trending/fol/follow 每天被数十个APP推送轰炸,有价…...

告别Anaconda臃肿安装!用VSCode+Miniconda打造轻量级Python数据分析环境

轻量级Python数据分析环境:VSCodeMiniconda高效组合方案 为什么需要告别Anaconda? 在数据科学领域,开发环境的效率直接影响工作产出。传统Anaconda发行版虽然功能全面,但其庞大的体积(通常超过3GB)和缓慢…...

STM32智能猪舍监控系统设计与实现

基于STM32的智能猪舍监控系统设计1. 项目概述1.1 系统背景现代养殖业正经历从传统人工管理向智能化管理的转型过程。在生猪养殖领域,环境参数如温湿度、空气质量、光照强度等对猪只健康生长具有决定性影响。传统人工监测方式存在响应滞后、精度不足等问题&#xff0…...

手把手教你用BurpSuite抓取火狐浏览器数据包(含代理设置完整流程)

从零掌握BurpSuite抓包:火狐浏览器配置与实战技巧 在Web安全测试领域,BurpSuite无疑是渗透测试工程师和开发者的瑞士军刀。不同于简单的网络调试工具,它提供了从基础抓包到高级漏洞探测的全套解决方案。本文将带你从环境搭建到实战抓包&#…...

嵌入式系统协议兼容性设计与升级优化

嵌入式系统中的协议兼容性设计与升级策略1. 多板系统中的通信协议挑战在现代嵌入式系统设计中,硬件架构往往由多块控制板协同工作构成。这种分布式架构带来了通信协议设计上的特殊挑战,特别是在系统升级和维护阶段。1.1 典型应用场景分析多板系统通常面临…...

告别手动组帧!用libmodbus库5分钟搞定Modbus RTU设备数据读取(C语言实战)

5分钟极速上手:用libmodbus高效读取工业设备数据的C语言实践指南 在工业自动化现场,当我们需要快速对接一台陌生的Modbus RTU设备时,传统的手动组帧方式往往让开发者陷入繁琐的字节操作和CRC校验计算中。我曾亲眼见过一位工程师花费三天时间调…...

为什么AI时代需要Lightpanda这样的无头浏览器?揭秘9倍内存效率背后的技术革命

为什么AI时代需要Lightpanda这样的无头浏览器?揭秘9倍内存效率背后的技术革命 【免费下载链接】browser The open-source browser made for headless usage 项目地址: https://gitcode.com/GitHub_Trending/browser32/browser 在当今AI代理、自动化测试和大规…...

包含多体型模板的AI虚拟智能试衣系统源码

温馨提示:文末有资源获取方式在电商竞争日益白热化的今天,商品展示图的质量直接决定了点击率与转化率。对于服装类目而言,传统模特拍摄不仅面临模特、摄影、场地的高昂成本,更受限于漫长的拍摄周期。为了解决这一行业痛点&#xf…...

SEO_10个提升网站排名的SEO优化技巧分享(80 )

SEO优化技巧:提升网站排名的10个秘诀 在当今竞争激烈的互联网市场中,网站的排名直接关系到它的流量和商业成功。SEO(搜索引擎优化)技巧的掌握能够显著提升网站在搜索引擎中的曝光度。本文将分享十个提升网站排名的SEO优化技巧&…...

ArcGIS JS API调用天地图WMTS服务实战:从GetCapabilities解析到完整代码实现

ArcGIS JS API调用天地图WMTS服务全流程解析 在WebGIS开发中,将第三方地图服务无缝集成到ArcGIS生态系统中是常见需求。天地图作为国内权威的地理信息服务,其WMTS(Web Map Tile Service)接口的调用尤为关键。本文将深入剖析从服务…...

Cherry Studio快速上手:从零部署到实战避坑指南

Cherry Studio快速上手:从零部署到实战避坑指南 【免费下载链接】cherry-studio 🍒 Cherry Studio is a desktop client that supports for multiple LLM providers. Support deepseek-r1 项目地址: https://gitcode.com/GitHub_Trending/ch/cherry-st…...

小型团队离线部署大模型指南:别先追参数,先把“能长期跑”的系统搭起来

小型团队离线部署大模型指南:别先追参数,先把“能长期跑”的系统搭起来 在很多人的想象里,离线部署大模型是一件很“硬核”的事:上几张高端 GPU,把一个足够大的模型拉起来,再配个网页聊天界面,似…...

【内存心法】别用玄学猜栈大小了!撕碎 RTOS 堆栈溢出的遮羞布,用 ARM MPU 构筑硬件级“死亡红区”与绝对沙箱

摘要:在错综复杂的多任务 RTOS 环境中,一个微小的局部数组越界,就能像癌细胞一样悄无声息地摧毁整个系统的内存空间。无数开发者迷信 FreeRTOS 的 vApplicationStackOverflowHook,却不知道它在真正的“跳跃式内存踩踏”面前形同虚…...

腰酸、失眠、伴侣打鼾……你的睡眠痛点,梦百合AI-Smart 3.0都懂

你是否有过这样的经历:睡了一整夜,醒来却腰酸背痛?躺在床上辗转反侧,大脑却清醒如初?又或者,被枕边人的鼾声折磨得彻夜难眠?这些睡眠困扰,已成为现代人的普遍常态。中国睡眠研究会20…...

手把手教你用AT89C51和UA741制作可调波形发生器(附完整代码)

从零构建基于AT89C51与UA741的智能波形发生器:硬件设计到代码实现的完整指南 在电子工程领域,波形发生器是实验室和教学中最基础也最实用的设备之一。传统商用波形发生器往往价格昂贵且功能固定,而自己动手制作一台可编程波形发生器不仅能深入…...

Sora死了

好莱坞杀死了 Sora:传统行业在 AI 浪潮下的无谓挣扎摘要:2026 年 3 月 24 日,OpenAI 宣布关闭 Sora,距离正式发布仅 6 个月。表面看是迪士尼退出授权协议导致的商业失败,实质是传统内容行业对 AI 技术抵制的缩影。本文…...

2026最新AI Agent核心架构解析:小白也能1分钟分清LLM与Agent的区别!收藏这份保姆级指南

本文用通俗易懂的方式解析了2026年最新的AI Agent核心架构,包含6大核心模块(感知、推理、规划、记忆、技能工具、执行反馈)和3大标准化协议(MCP、A2A、Skills),并详细阐述了它们如何协同工作。文章还清晰地…...

DirectSPI:STM32寄存器级零开销SPI驱动库

1. DirectSPI 库概述DirectSPI 是一个面向特定 STM32 微控制器系列的超高速、零抽象层 SPI 驱动库。其设计哲学与标准 HAL/LL 库截然不同:不封装寄存器访问,不引入中间状态机,不进行参数校验,不依赖 CMSIS 启动文件或系统时钟配置…...

从实验室到生产线:LeRobot如何用AI重新定义机器人控制范式?

从实验室到生产线:LeRobot如何用AI重新定义机器人控制范式? 【免费下载链接】lerobot 🤗 LeRobot: State-of-the-art Machine Learning for Real-World Robotics in Pytorch 项目地址: https://gitcode.com/GitHub_Trending/le/lerobot …...

网络协议分析AI应用:使用PyTorch进行网络流量异常检测

网络协议分析AI应用:使用PyTorch进行网络流量异常检测 1. 引言:网络安全的新防线 最近遇到一个真实案例:某电商平台在促销期间突然遭遇流量激增,起初运维团队以为是正常用户访问,直到服务器开始大面积瘫痪才发现是DD…...

Stalwart Mail Server企业级部署:现代化邮件服务器的终极解决方案

Stalwart Mail Server企业级部署:现代化邮件服务器的终极解决方案 【免费下载链接】stalwart Secure & Modern All-in-One Mail Server (IMAP, JMAP, SMTP) 项目地址: https://gitcode.com/GitHub_Trending/ma/stalwart 在当今数字化转型浪潮中&#xff…...