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

顺序表 -->增、删、查、改等详细操作

个人主页 流年如梦专栏 《C语言》 《数据结构》文章目录一.线性表二.顺序表2.1概念与结构2.2静态顺序表2.3动态顺序表2.3.1动态顺序表结构体2.3.2头文件声明 -- SeqList.h2.3.3源文件实现 -- SeqList.c2.3.3.1初始化2.3.3.2销毁2.3.3.3打印2.3.3.4扩容检查2.3.3.5尾插尾删2.3.3.6头插头删2.3.3.7指定位置插入与删除2.3.3.8查找2.3.4主函数 -- test.c总结动态顺序表⚠️易错点Ladies and gentlemen本篇文章先了解一下线性表和顺序表其中主要学习动态顺序表重点全程高能不容错过前言顺序表是数据结构中最基础、最常用的线性表结构它以一段物理连续的内存空间存储数据是数组的封装与升级。本篇文章会实现动态顺序表的初始化、增删查改、扩容、销毁等核心接口并通过测试代码验证功能为后续学习链表、栈、队列等数据结构打下扎实基础一.线性表线性表是n个具有相同特性的数据元素的有限序列是一种在实际中广泛使用的数据结构常见的线性表顺序表、链表、栈、队列、字符串等线性表又分为逻辑结构和物理结构其中逻辑结构-- 线性结构连续一条直线物理结构-- 不一定连续(物理储存通常是以数组顺序表和链式结构链表这两种方式)二.顺序表2.1概念与结构顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构一般情况下采用数组存储。顺序表和数组的区别数组-- 原生存储空间顺序表-- 对数组的封装实现增、删、改、查等完整接口可以理解为数组-- 基础原料顺序表-- 封装好的成品结构在基础原料的基础上2.2静态顺序表使用定长数组存储元素#defineN7typedefstructSeqList{SLDataType a[N];intsize;}SL;分析其中a[N]为定长数组size为有效数据个数但缺点是空间给少了不够用给多了造成空间浪费2.3动态顺序表2.3.1动态顺序表结构体动态顺序表按需申请、释放空间更灵活typedefstructSeqList{SLDataType*a;intsize;intcapacity;}SL;分析其中SLDataType* a为指向动态开辟的数组size为有效数据个数capacity为空间容量2.3.2头文件声明 -- SeqList.h参考代码如下#pragmaonce#define_CRT_SECURE_NO_WARNINGS#includestdio.h#includestdlib.h#includeassert.h//初始容量#defineINIT_CAPACITY4//顺序表存储的数据类型typedefintSLDataType;//SLDataType为int类型//动态顺序表结构体typedefstructSeqList{SLDataType*a;intsize;intcapacity;}SL;//初始化voidSLInit(SL*ps);//销毁voidSLDestroy(SL*ps);//打印voidSLPrint(SL*ps);//扩容判断voidSLCheckCapacity(SL*ps);//头部插入删除voidSLPushBack(SL*ps,SLDataType x);voidSLPopBack(SL*ps);//尾部插入删除voidSLPushFront(SL*ps,SLDataType x);voidSLPopFront(SL*ps);//指定位置之前插入数据voidSLInsert(SL*ps,intpos,SLDataType x);//指定位置之前删除数据voidSLErase(SL*ps,intpos);//查找intSLFind(SL*ps,SLDataType x);2.3.3源文件实现 -- SeqList.c2.3.3.1初始化对动态顺序表进行初始化voidSLInit(SL*ps){assert(ps);ps-aNULL;ps-size0;ps-capacity0;}分析把数组指针置空有效数据个数和容量都清0assert防止传进来空指针2.3.3.2销毁销毁动态顺序表释放内存voidSLDestroy(SL*ps){assert(ps);free(ps-a);ps-aNULL;ps-size0;ps-capacity0;}分析必须free掉动态开辟的数组避免内存泄漏指针置空、数据置0防止野指针2.3.3.3打印遍历打印顺序表中所有有效数据voidSLPrint(SL*ps){assert(ps);for(inti0;ips-size;i){printf(%d ,ps-a[i]);}printf(\n);}2.3.3.4扩容检查判断空间是否满了满了就扩容一般扩 2 倍没了再扩voidSLCheckCapacity(SL*ps){assert(ps);if(ps-sizeps-capacity){intnewCapacityps-capacity0?INIT_CAPACITY:ps-capacity*2;SLDataType*tmp(SLDataType*)realloc(ps-a,newCapacity*sizeof(SLDataType));if(tmpNULL){perror(realloc fail);return;}ps-atmp;ps-capacitynewCapacity;}}分析第一次扩容给INIT_CAPACITY4之后每次扩2倍用realloc更高效所有插入操作前都要调用它2.3.3.5尾插尾删尾插在顺序表最后插入一个数据voidSLPushBack(SL*ps,SLDataType x){assert(ps);SLCheckCapacity(ps);ps-a[ps-size]x;ps-size;}分析插入操作先检查扩容再把数据放到size位置时间复杂度为O(1)尾删删除顺序表最后一个数据voidSLPopBack(SL*ps){assert(ps);assert(ps-size0);ps-size--;}分析不用真正删除只需size--逻辑删除使用之前必须断言size0防止删空表导致程序崩溃2.3.3.6头插头删头插在顺序表最前面插入数据voidSLPushFront(SL*ps,SLDataType x){assert(ps);SLCheckCapacity(ps);for(intips-size;i0;i--){ps-a[i]ps-a[i-1];}ps-a[0]x;ps-size;}分析插入操作先检查扩容所有数据先向后挪一位再把数据放在下标为0的位置时间复杂度为O(N)效率低头删删除第一个数据voidSLPopFront(SL*ps){assert(ps);assert(ps-size0);for(inti0;ips-size-1;i){ps-a[i]ps-a[i1];}ps-size--;}分析后面所有数据向前覆盖时间复杂度为O(N)效率低2.3.3.7指定位置插入与删除插入在下标pos前插入数据xvoidSLInsert(SL*ps,intpos,SLDataType x){assert(ps);assert(pos0posps-size);SLCheckCapacity(ps);for(intips-size;ipos;i--){ps-a[i]ps-a[i-1];}ps-a[pos]x;ps-size;}分析pos位置及之后的数据整体后移必须检查pos合法性 --0 ≤ pos ≤ size删除删除下标pos位置的数据voidSLErase(SL*ps,intpos){assert(ps);assert(pos0posps-size);for(intipos;ips-size-1;i){ps-a[i]ps-a[i1];}ps-size--;}分析pos后面的数据整体前移覆盖并且注意pos范围为0 ≤ pos size2.3.3.8查找查找x找到返回下标没找到则返回-1intSLFind(SL*ps,SLDataType x){assert(ps);for(inti0;ips-size;i){if(ps-a[i]x){returni;}}return-1;}分析顺序遍历时间复杂度为O(N)常用于修改、删除前先定位位置2.3.4主函数 -- test.c参考代码如下#includeSeqList.hvoidTestSeqList(){SL sl;//初始化SLInit(sl);//尾插SLPushBack(sl,1);SLPushBack(sl,2);SLPushBack(sl,3);SLPushBack(sl,4);printf(尾插 1 2 3 4);SLPrint(sl);//头插SLPushFront(sl,0);printf(头插 0);SLPrint(sl);//指定位置插入SLInsert(sl,3,99);printf(在下标3插入99);SLPrint(sl);//查找intposSLFind(sl,3);if(pos!-1){printf(找到 3下标是%d\n,pos);}//删除指定位置SLErase(sl,3);printf(删除下标3);SLPrint(sl);//头删SLPopFront(sl);printf(头删);SLPrint(sl);//尾删SLPopBack(sl);printf(尾删);SLPrint(sl);//销毁SLDestroy(sl);printf(销毁成功\n);}intmain(){TestSeqList();//调用函数return0;}运行结果总结动态顺序表动态顺序表是对数组的封装用连续物理内存存储数据支持动态扩容结构包含三要素数据指针a、有效数据size、容量capacity核心操作尾插与尾删、头插与头删、指定位置插入删除、查找所有接口按模块化实现.h声明、.c实现、test.c测试扩容规则初始空间容量为4满了2倍扩容需要用realloc尾插尾删时间复杂度为O(1)头插头删、中间插入删除的时间复杂度为O(N)因为需要挪动数据⚠️易错点忘记断言assert空指针访问导致崩溃扩容判断错误未判断size capacity就扩容realloc直接赋值不用临时变量tmp接收易丢失数据插入或删除的循环方向或边界写错造成数据覆盖或越界不检查pos合法性插入删除越界空表执行删除size变负逻辑异常销毁后未置空NULLfree后不置NULL产生野指针扩容后不更新capacity导致容量逻辑混乱 关注我们一路同行从入门到大师慢慢沉淀、稳步成长❤️ 点赞鼓励原创让优质内容被更多人看见⭐ 收藏收好核心知识点与实战技巧需要时随时查阅 评论分享你的疑问或踩坑经历一起交流避坑、共同进步

相关文章:

顺序表 -->增、删、查、改等详细操作

个人主页:流年如梦 专栏:《C语言》 《数据结构》 文章目录一.线性表二.顺序表2.1概念与结构2.2静态顺序表2.3动态顺序表2.3.1动态顺序表结构体2.3.2头文件声明 --> SeqList.h2.3.3源文件实现 --> SeqList.c2.3.3.1初始化2.3.3.2销毁2.3.3.3打印2.3…...

如何快速使用163MusicLyrics:音乐歌词获取与处理的完整指南

如何快速使用163MusicLyrics:音乐歌词获取与处理的完整指南 【免费下载链接】163MusicLyrics 云音乐歌词获取处理工具【网易云、QQ音乐】 项目地址: https://gitcode.com/GitHub_Trending/16/163MusicLyrics 在当今数字音乐时代,歌词同步显示已成…...

LinkSwift网盘直链下载神器:告别限速困扰的终极解决方案

LinkSwift网盘直链下载神器:告别限速困扰的终极解决方案 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天…...

VMware Workstation Pro 17许可证密钥:终极免费激活方案与完整使用指南

VMware Workstation Pro 17许可证密钥:终极免费激活方案与完整使用指南 【免费下载链接】VMware-Workstation-Pro-17-Licence-Keys Free VMware Workstation Pro 17 full license keys. Weve meticulously organized thousands of keys, catering to all major vers…...

Voxtral-4B-TTS-2603语音合成教程:casual_male/neutral_female等音色效果对比实测

Voxtral-4B-TTS-2603语音合成教程:casual_male/neutral_female等音色效果对比实测 1. 引言:认识Voxtral语音合成模型 Voxtral-4B-TTS-2603是Mistral团队推出的开源语音合成模型,专门为语音助手、客服系统等实际应用场景设计。这个模型最大的…...

终极指南:如何在Blender中无缝导入Rhino 3D文件

终极指南:如何在Blender中无缝导入Rhino 3D文件 【免费下载链接】import_3dm Blender importer script for Rhinoceros 3D files 项目地址: https://gitcode.com/gh_mirrors/im/import_3dm 你是否曾经在Rhino中创建了精美的3D模型,却无法直接在Bl…...

告别表单布局混乱:5个react-bootstrap网格与堆叠混合设计终极指南

告别表单布局混乱:5个react-bootstrap网格与堆叠混合设计终极指南 【免费下载链接】react-bootstrap Bootstrap components built with React 项目地址: https://gitcode.com/gh_mirrors/re/react-bootstrap react-bootstrap是基于React构建的Bootstrap组件库…...

注塑件变形怎么调优?全尺寸3D检测如何助力精密注塑“减废增效”

汽车灯具全尺寸 3D 测量技术报告 / 3D Metrology for Automotive Lighting[!TIP] 请选择阅读语言 / Please select your language:🇨🇳 点击展开:中文版 (Click to Expand: Chinese Version) 技术报告:基于拍照式蓝光三维扫描的汽…...

AI写专著全流程解析:AI工具如何助力20万字专著快速完成?

学术专著需要严谨的态度,背后则是大量资料和数据的支持。收集这些资料和整合数据往往是写作过程中最繁琐且耗时的部分。研究人员必须广泛地寻找国内外最新的文献,这不光要确保资料的权威性和相关性,还要追溯到原始出处,避免引用错…...

终极Node.js Word文档解析指南:告别Office依赖的纯JavaScript解决方案

终极Node.js Word文档解析指南:告别Office依赖的纯JavaScript解决方案 【免费下载链接】node-word-extractor Read data from a Word document using node.js 项目地址: https://gitcode.com/gh_mirrors/no/node-word-extractor 还在为Node.js项目中处理Word…...

ot.js:终极实时协作编辑解决方案,彻底改变多人编程体验

ot.js:终极实时协作编辑解决方案,彻底改变多人编程体验 【免费下载链接】ot.js 项目地址: https://gitcode.com/gh_mirrors/ot/ot.js ot.js 是一款基于 Operational Transformation(OT)算法的实时协作编辑引擎&#xff0c…...

终极Windows 10瘦身指南:16个核心功能让系统重获新生

终极Windows 10瘦身指南:16个核心功能让系统重获新生 【免费下载链接】Win10BloatRemover Configurable CLI tool to easily and aggressively debloat and tweak Windows 10 by removing preinstalled UWP apps, services and more. Originally based on the W10 d…...

React Native Draggable FlatList性能优化:10个实用技巧提升应用流畅度

React Native Draggable FlatList性能优化:10个实用技巧提升应用流畅度 【免费下载链接】react-native-draggable-flatlist A drag-and-drop-enabled FlatList for React Native 项目地址: https://gitcode.com/gh_mirrors/re/react-native-draggable-flatlist …...

ViGEmBus虚拟手柄驱动:让所有手柄都能玩Windows游戏的终极解决方案

ViGEmBus虚拟手柄驱动:让所有手柄都能玩Windows游戏的终极解决方案 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus 你是否曾经因为手中的游戏手柄…...

为什么92%的车载以太网项目DoIP协议栈延期交付?C++底层设计缺陷深度复盘(含可运行参考实现)

更多请点击: https://intelliparadigm.com 第一章:DoIP协议栈延期交付的行业现状与根本归因 行业交付延迟的普遍性表现 当前,超过68%的汽车电子供应商在DoIP(Diagnostics over Internet Protocol)协议栈项目中遭遇交…...

LFM2.5-1.2B-Instruct部署教程:基于Unsloth训练框架的轻量指令模型实践

LFM2.5-1.2B-Instruct部署教程:基于Unsloth训练框架的轻量指令模型实践 1. 模型介绍与适用场景 1.1 模型基本信息 LFM2.5-1.2B-Instruct是一个1.2B参数量的轻量级指令微调大语言模型,由Liquid AI基于Unsloth训练框架开发。这个模型专为边缘设备和低资…...

Java多租户数据泄露事故频发?3个被90%团队忽略的隔离漏洞,今天必须修复

更多请点击: https://intelliparadigm.com 第一章:Java多租户数据泄露事故的严峻现实 近年来,Java生态中基于Spring Boot构建的SaaS平台频发跨租户数据泄露事件——根本原因并非加密缺失,而是租户隔离逻辑在数据访问层被意外绕过…...

3分钟掌握:如何用AI将B站视频秒变可编辑文字稿

3分钟掌握:如何用AI将B站视频秒变可编辑文字稿 【免费下载链接】bili2text Bilibili视频转文字,一步到位,输入链接即可使用 项目地址: https://gitcode.com/gh_mirrors/bi/bili2text 还在为整理视频内容而烦恼吗?无论是学习…...

Docker WASM边缘计算落地七宗罪(附Gartner 2024边缘就绪度评估矩阵V2.1),错过本次升级将丧失2025年信创准入资格

更多请点击: https://intelliparadigm.com 第一章:Docker WASM边缘计算落地七宗罪总览 WebAssembly(WASM)与 Docker 的融合曾被寄予厚望——轻量、沙箱化、跨平台的运行时,叠加容器生态的编排能力,理应成为…...

旧盒子秒变全网通电视盒:实测MGV3000刷机后,如何安装必备软件与优化设置

旧盒子焕新指南:MGV3000刷机后的极致优化全攻略 当你手中的MGV3000电视盒子完成刷机,进入那个清爽纯净的新系统时,兴奋之余或许会有些茫然——接下来该做什么?本文将带你从零开始,将这个"裸机"打造成功能强大…...

Flask事务与并发安全:掌握 Flask 中数据库事务的提交、回滚与锁机制

更多内容请见: 《Python Web项目集锦》 - 专栏介绍和目录 在互联网应用从“玩具项目”走向“生产环境”的跨越中,最隐秘、最致命的杀手往往不是业务逻辑的 Bug,而是数据一致性与并发安全问题。 当两个用户同时抢购最后一件商品;当扣减库存的脚本刚好在更新数据库时遭遇服务…...

android-parcelable-intellij-plugin常见问题解答:新手入门避坑指南

android-parcelable-intellij-plugin常见问题解答:新手入门避坑指南 【免费下载链接】android-parcelable-intellij-plugin IntelliJ Plugin for Android Parcelable boilerplate code generation. 项目地址: https://gitcode.com/gh_mirrors/an/android-parcelab…...

Flask会话管理:SessionFactory 与 Flask-SQLAlchemy 的生命周期管理

更多内容请见: 《Python Web项目集锦》 - 专栏介绍和目录 文章目录 第一章:解剖底层——原生 SQLAlchemy 的三驾马车 1.1 Engine(引擎):物理连接的工厂 1.2 SessionFactory(会话工厂):会话的流水线 1.3 Session(会话):对象的生命周期容器 第二章:化繁为简——Flask…...

Phi-3-mini-4k-instruct-gguf从零开始:中小企业低成本AI助手搭建指南

Phi-3-mini-4k-instruct-gguf从零开始:中小企业低成本AI助手搭建指南 1. 为什么选择Phi-3-mini-4k-instruct-gguf 对于中小企业来说,搭建AI助手需要考虑三个关键因素:成本、易用性和实用性。Phi-3-mini-4k-instruct-gguf正是为这种需求而生…...

AI模型优化五大核心技术解析与实践

1. AI模型优化技术概述在当今AI技术快速发展的背景下,模型规模呈指数级增长,从早期的几百万参数到如今动辄上千亿参数的大语言模型。这种增长带来了前所未有的性能提升,同时也对推理效率提出了严峻挑战。作为一名长期从事AI模型部署的工程师&…...

高效视频格式转换:跨平台B站缓存视频批量处理方案

高效视频格式转换:跨平台B站缓存视频批量处理方案 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter m4s-converter是一款专为解决B站缓…...

Cat-Catch终极指南:5步快速掌握浏览器资源嗅探工具

Cat-Catch终极指南:5步快速掌握浏览器资源嗅探工具 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 你是否曾经在浏览网页时&#xff0c…...

终极指南:如何实现无线iOS应用安装?告别电脑束缚!

终极指南:如何实现无线iOS应用安装?告别电脑束缚! 【免费下载链接】App-Installer On-device IPA installer 项目地址: https://gitcode.com/gh_mirrors/ap/App-Installer 还在为安装第三方iOS应用而烦恼吗?每次都需要连接…...

边缘计算架构设计与应用实践解析

1. 边缘计算与分布式云架构的核心价值在传统云计算架构中,所有计算和存储资源都集中在远程数据中心,用户通过互联网连接访问这些服务。这种架构存在两个根本性问题:第一,网络延迟受物理距离限制,实时性要求高的应用体验…...

OpCore-Simplify:黑苹果新手15分钟搞定EFI配置的终极指南

OpCore-Simplify:黑苹果新手15分钟搞定EFI配置的终极指南 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 还在为黑苹果复杂的EFI配置而头疼…...