数据结构<一>顺序表
目录一、线性表的定义二、顺序表的定义三、顺序表的定义及初始化四、顺序表的插入五、顺序表的删除六、顺序表的修改七、顺序表的查找八、顺序表的显示九、测试主程序一、线性表的定义线性表是一种基本的数据结构它是由n个数据元素a[1]、a[2]、...、a[n]组成的有限序列。 线性表中的数据元素之间呈现出一对一的顺序关系每个元素都有一个前驱和后继元素除了第一个元素没有前驱最后一个元素没有后继它可以用顺序存储结构和链式存储结构来实现。 举一个例子一个班级的学生名单可以看作是一个线性表其中每一个学生都是一个数据元素学生名单中的数据元素之间存在一定的顺序关系每个学生都有一个前一个和后一个学生除了第一个学生没有前一个学生最后一个学生没有后一个学生。如果使用顺序存储结构来实现学生名单那么每个学生的信息将被存储在一个数组中如果使用链式存储结构可以将每个学生的信息存储在一个链表的节点中。无论是使用数组还是链表都可以对学生名单进行插入、删除、查找和遍历等常见的操作这些操作都是线性表的基本操作。 线性表作为一种基本的数据结构类型在计算机存储器中的表示一般有两种形式一种是顺序存储一种是链式存储。二、顺序表的定义线性表的顺序存储又叫顺序表。线性表的顺序存储是指将数据元素按照其逻辑顺序依次存储在一组连续的物理位置上通过数组来实现。顺序存储结构以连续的存储单元顺序存放线性表的元素可以直接访问元素查找和遍历较快但插入和删除操作需要移动大量元素效率较低。 线性表的顺序存储可以用一维数组来实现。数组的下标从0开始表示元素在数组中的位置。 具体实现步骤如下 1. 定义一个数组用来存储线性表中的元素数组大小为线性表的长度 2. 将线性表中的元素按照逻辑顺序存储在数组中即将第i个元素存储在数组中下标为i-1的位置上 3. 可以通过下标访问具体的元素数组下标从0开始第i个元素的下标为i-1 4. 可以通过数组下标修改或者查询元素的值 5. 插入元素时需要将插入点之后的元素依次后移然后在插入点处插入新元素 6. 删除元素时需要将删除点之后的元素依次前移然后删除最后一个元素。 顺序表具有随机存取的优点可以直接按照下标访问任意位置的元素。但是因为删除或插入操作时需要移动大量元素所以其插入和删除操作效率较低。三、顺序表的定义及初始化//顺序表的定义 #define MAXSIZE 100 ​ typedef struct { int data[MAXSIZE]; // 存储顺序表的数组 int length; // 顺序表长度 } sqlist_t; ​ //顺序表的初始化 sqlist_t *sqlist_init(void) { sqlist_t *list (sqlist_t *)malloc(sizeof(sqlist_t)); list-length 0; // 顺序表的长度初始化为0 memset(list-data, 0, sizeof(list-data)); // 清空数组的值 return list; }四、顺序表的插入插入元素时需要将插入点之后的元素依次后移然后在插入点处插入新元素 例如在 {1,2,3,4,5} 的第 3 个位置上插入元素 6实现过程如下1. 遍历至顺序表存储第 3 个数据元素的位置如图所示2. 将元素 3 以及后续元素 4 和 5 整体向后移动一个位置如图所示3.将新元素 6 放入腾出的位置如图所示// 顺序表的插入 int sqlist_insert(sqlist_t *list, int index, int val) { // index 1 , index 是从1 开始的 // index list-length 1 大于顺序表的长度是 list-length if (index 1 || index list-length 1 || list-length MAXSIZE) { return -1; // 失败 -1 } // 最后一个元素开始往后移动 // 倒数第二个元素 移动到倒数第一个元素的位置 一直移动到index 的位置 // index 指向的元素也要往后移动 for (int i list-length - 1; i index - 1; i--) { // 4 3 2 list-data[i 1] list-data[i]; // 往后移动1个元素 } list-data[index - 1] val; // 插入元素 list-length; // 顺序表的长度增加1 return 0; }五、顺序表的删除删除元素时需要将删除点之后的元素依次前移然后删除最后一个元素。例如从 {1,2,3,4,5} 中删除元素 3 的过程如图所示// 顺序表的删除 int sqlist_delete(sqlist_t *list, int index, int *pval) { // index 1 , index 是从1 开始的 // index list-length 1 大于顺序表的长度是 list-length if (index 1 || index list-length 1) { return -1; // 失败 -1 } *pval list-data[index - 1]; // 先将删除的元素赋值给pval ​ // 把后面的元素往前移动 for (int i index - 1; i list-length - 1; i) { list-data[i] list-data[i 1]; // 往前移动1个元素 } list-length--; // 顺序表的长度减少1 return 0; }六、顺序表的修改// 顺序表的修改 int sqlist_modify(sqlist_t *list, int index, int newval) { // index 1 , index 是从1 开始的 // index list-length 1 大于顺序表的长度是 list-length if (index 1 || index list-length 1) { return -1; // 失败 -1 } list-data[index - 1] newval; // 把newval 的值更新到数组内 return 0; }七、顺序表的查找// 顺序表的查找 int sqlist_search(sqlist_t *list, int val) { for (int i 0; i list-length; i) { if (val list-data[i]) // 查找元素 { return i 1; // 找到返回元素的位置 } } return 0; // 没有找到返回0 }八、顺序表的显示// 顺序表的显示 int sqlist_print(sqlist_t *list) { for (int i 0; i list-length; i) { printf(%d , list-data[i]); } printf(\n); return 0; }九、测试主程序//测试主程序 int main(int argc, char const *argv[]) { sqlist_t *L sqlist_init(); for (int i 0; i 5; i) { sqlist_insert(L, i 1, i 1); } sqlist_print(L); sqlist_insert(L, 3, 6); sqlist_print(L); int value; sqlist_delete(L, 3, value); printf(删除的元素是%d\n, value); sqlist_print(L); sqlist_delete(L, 3, value); printf(删除的元素是%d\n, value); sqlist_print(L); sqlist_modify(L, 3, 40); sqlist_print(L); int pos sqlist_search(L, 4); if (pos 0) // 查找元素 { printf(%d 查找的元素在第%d个位置\n, 4, pos); } else { printf(%d 查找的元素不存在\n, 4); } ​ pos sqlist_search(L, 40); if (pos 0) // 查找元素 { printf(%d 查找的元素在第%d个位置\n, 40, pos); } else { printf(%d 查找的元素不存在\n, 40); } ​ return 0; } ​

相关新闻

(84页PPT)IBM采购供应链全景规划方法论L1L3蓝图流程规划地图与详细清单设计80流程业务痛点分析(附下载方式)

(84页PPT)IBM采购供应链全景规划方法论L1L3蓝图流程规划地图与详细清单设计80流程业务痛点分析(附下载方式)

篇幅所限,本文只提供部分资料内容,完整资料请看下面链接 (84页PPT)IBM采购供应链全景规划方法论L1L3蓝图流程规划地图与详细清单设计80流程业务痛点分析.pptx_智慧方案集成系统架构资源-CSDN下载 资料解读:某集团数字…

2026/10/15 4:16:25 阅读更多 →
DS1302实时时钟芯片应用与优化指南

DS1302实时时钟芯片应用与优化指南

1. DS1302实时时钟芯片的核心特性与应用场景DS1302作为一款经典的实时时钟芯片,在嵌入式系统中扮演着关键角色。我第一次接触这个芯片是在2015年做一个智能家居控制器项目,当时需要记录设备操作日志的时间戳。相比其他RTC芯片,DS1302有几个独…

2026/10/15 5:24:55 阅读更多 →
阻抗变换器原理、设计与工程应用全解析

阻抗变换器原理、设计与工程应用全解析

1. 阻抗变换器的基础概念与核心价值阻抗变换器这个看似简单的电路元件,在电子工程领域扮演着关键角色。我第一次接触这个概念是在调试射频电路时,当时信号在传输线上出现了严重的反射问题,导致接收端波形畸变。一位资深工程师递给我一个指甲盖…

2026/10/14 6:14:43 阅读更多 →

最新新闻

基因组测序技术在多倍体与杂合基因组组装中的突破与应用

基因组测序技术在多倍体与杂合基因组组装中的突破与应用

1. 项目背景与行业痛点基因组测序技术在过去二十年里经历了从"奢侈品"到"常规工具"的转变。2010年完成一个人类基因组测序还需要数万美元,而如今同样的工作仅需几百美元就能完成。这种成本下降使得基因组测序从人类医学领域迅速扩展到动植物研究…

2026/10/15 9:05:35 阅读更多 →
WorkBuddy App上线实战:六阶段路径与16个真机坑避坑指南

WorkBuddy App上线实战:六阶段路径与16个真机坑避坑指南

1. 项目概述:这不是一个“教你怎么装软件”的教程,而是一份从零到上线的实战手记 WorkBuddy 这个名字最近在开发者圈子里出现频率越来越高,但很多人点开官网、下载安装、试用几个 Skill 后就停住了——它看起来像一个智能终端助手&#xff0…

2026/10/15 9:05:35 阅读更多 →
MATLAB数字信号处理:IIR滤波器设计与应用实战

MATLAB数字信号处理:IIR滤波器设计与应用实战

1. 数字滤波器的美颜相机原理数字滤波器在信号处理领域的地位,就像美颜相机在摄影中的作用一样关键。它能对信号进行"精修",突出我们想要的频率特征,或者消除那些干扰成分。IIR(无限脉冲响应)滤波器作为数字…

2026/10/15 9:05:35 阅读更多 →
Vue+SpringBoot构建门诊电子病历与药品管理系统

Vue+SpringBoot构建门诊电子病历与药品管理系统

1. 项目概述与核心价值门诊电子病历处方药品进销存管理系统是医疗信息化领域的重要应用,它通过整合Vue.js前端框架与SpringBoot后端技术,实现了医疗机构日常运营中三大核心业务的一体化管理。这个系统我前后参与过三次迭代开发,最深切的体会是…

2026/10/15 9:05:35 阅读更多 →
SpringBoot火锅店管理系统开发与毕业设计实践

SpringBoot火锅店管理系统开发与毕业设计实践

1. 项目概述与核心价值火锅店管理系统作为典型的餐饮行业信息化解决方案,其核心价值在于通过数字化手段解决传统火锅店经营中的三大痛点:人工记录易出错、高峰期服务效率低、经营数据分析滞后。基于SpringBoot框架开发的这套系统,不仅满足了计…

2026/10/15 9:05:35 阅读更多 →
从零手写卷积神经网络:2019经典作业实战笔记与避坑指南

从零手写卷积神经网络:2019经典作业实战笔记与避坑指南

1. 为什么值得花时间啃这份经典作业如果你正在入门计算机视觉,或者想系统理解卷积神经网络到底是怎么跑起来的,那这份2019版的课程作业大概率是你绕不开的一站。它不像市面上很多“调包式”教程那样,给你一个现成模型跑跑就完事,而…

2026/10/15 9:04:33 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →