数据结构(Chapter Two -02)—顺序表基本操作实现
在前一部分我们了解线性表和顺序表概念,如果有不清楚可以参考下面的博客:
数据结构(Chapter Two -01)—线性表及顺序表-CSDN博客
首先列出线性表的数据结构:
#define MaxSize 50 //定义顺序表最大长度
typedef struct{ElemType data[MaxSize];//顺序表的元素int length; //顺序表的当前长度
}SqList; //顺序表的类型定义
接下来就是插入、删除、按值查找。
插入
顺序表,我们可以思考数组这一典型的顺序表数据结构,我们需要在第i个位置插入新元素e。
这里定义顺序表为L,基本操作流程就是:
1、判断数据有效性和存储空间是否满,注意了可以插到表尾后一个元素,所以i>L.length+1
2、为第i个位置腾出位置,那就把第i个元素及之后的元素往后移,注意了这是从最后一个元素开始移的。
3、在位置i放入元素e。
代码如下:
bool ListInsert(SqList &L,int i,ElemType e){if(i<1||i>L.length+1) //判断i的范围是否有效return false;if(L.length>=MaxSize)//当前存储空间已满,不能插入return false;for(int j =L.length;j>=i;j--)//将第i个元素及之后的元素后移L.data[j]=L.data[j-1];L.data[i-1]=e; //在位置i处放eL.length++; //线性表长度加1return true;
}
最好情况:表尾插入,不需要移,时间复杂度为O(1)
最坏情况:表首插入,需要执行n次移动操作,时间复杂度为O(n)
平均情况:O(n)

删除
删除第i个位置的元素,将删除的值赋给e
操作流程:
1、判断数据有效性
2、将删除的值赋给e
3、将第i+1个元素及后面元素往前移
bool ListDelete(SqList &L,int i,Elemtype &e){if(i<1||i>L.length) //判断i的范围是否有效return false;e = L.data[i-1]; //将删除的元素赋值给efor(int j=i;j<L.length;j++)//将第i个位置后的元素前移L.data[j-1]=L.data[j];L.length--; //线性表长度减1return true;
}
最好情况:删除表尾,不需移,时间复杂度O(1)
最坏情况:删除表首元素,需要移动除表头元素外的所有元素,时间复杂度为O(n)
平均情况:O(n)

按值查找
查找第一个元素等于e的元素,并放回其位序(位序不等于下标,等于下标+1)
操作流程:
遍历一遍表,当找到第一个符合的就直接放回位序,结束查找
int LocateElem(SqList L,ElemType e){for(int i =0;i<L.length;i++){//遍历一遍表,当找到第一个符合的就直接放回位序,结束查找if(L.data[i]==e)return i+1;}return 0;
}
最好情况:元素在表头,时间复杂度O(1)
最坏情况:元素在表尾,需要比较n次,时间复杂度O(n)
平均情况:O(n)

最后,拿着写代码来试一波效果!
#include <stdio.h>
#define MaxSize 20
typedef struct{int data[MaxSize];int length=0;
}SqList;bool ListInsert(SqList &L,int i,int e){if(i<1||i>L.length+1) //判断i的范围是否有效return false;if(L.length>=MaxSize)//当前存储空间已满,不能插入return false;for(int j =L.length;j>=i;j--)//将第i个元素及之后的元素后移L.data[j]=L.data[j-1];L.data[i-1]=e; //在位置i处放eL.length++; //线性表长度加1return true;
}bool ListDelete(SqList &L,int i,int &e){if(i<1||i>L.length) //判断i的范围是否有效return false;e = L.data[i-1]; //将删除的元素赋值给efor(int j=i;j<L.length;j++)//将第i个位置后的元素前移L.data[j-1]=L.data[j];L.length--; //线性表长度减1return true;
}int LocateElem(SqList L,int e){for(int i =0;i<L.length;i++){//遍历一遍表,当找到第一个符合的就直接放回位序,结束查找if(L.data[i]==e)return i+1;}return 0;
}int main()
{SqList L;int e = 0;for(int i=0;i<10;i++){//给顺序表赋值L.data[i]=10-i;L.length++;}printf("原始顺序表:");for(int i=0;i<L.length;i++) printf("%d ",L.data[i]);printf("\n");ListInsert(L,4,e);//第四个位置加12printf("增加后顺序表:");for(int i=0;i<L.length;i++) printf("%d ",L.data[i]);printf("\n");ListDelete(L,3,e);//第三个位置删除printf("删除后顺序表:");for(int i=0;i<L.length;i++) printf("%d ",L.data[i]);printf("\n");printf("查找0的位置:");int ans = LocateElem(L,0);//查找0的位置printf("%d",ans);}
运行结果如下:
最后的最后,可能会有友友对于代码参数里面的"&"会有疑惑?
看一下函数顺序表不加“&”的运行结果:
可以看出顺序表没有改变。这个“&”的作用是取地址或者引用,在函数的参数列表里面看到的“&”,通常代表了引用。引用可以看成是变量的别名,它的好处就是避免了复制参数的开销,并且允许函数直接访问和修改原始数据。注意了这个引用是可以修改原始数据的,就是修改main里面的顺序表L。没有引用,虽然完成了函数的流程,但修改不了原始数据表。
看一段代码:
void increment(int &x){x++;
}
int main(){
int y=5;
increment(y);//y的值由5变成6
}
这个里面“&”为引用,当我们调用increment(y)时,我们实际上把y的地址传递到函数,而不是它的值,这样函数可以直接修改y,在函数参数中使用引用时,我们不需要在调用函数中再次使用&符号,因为在定义函数的时候已经定义了该参数需要引用。
可以敲敲代码试一下!
相关文章:
数据结构(Chapter Two -02)—顺序表基本操作实现
在前一部分我们了解线性表和顺序表概念,如果有不清楚可以参考下面的博客: 数据结构(Chapter Two -01)—线性表及顺序表-CSDN博客 首先列出线性表的数据结构: #define MaxSize 50 //定义顺序表最大长度 typedef struct{ElemType data…...
SQL语句整理二--Mysql
文章目录 知识点梳理:1. mysql 中 in 和 exists 区别2. varchar 与 char 的区别 查看表结构:获取当前时间:查看建表语句:修改用户密码:查看所有用户:grant命令:判断当前数据库有多少连接数&…...
oracle与gbase8s迁移数据类型对照
声明:以下为笔者阅读gbase官方文档和oracle官方文档的理解,如有错误,敬请指正。oracle与gbase8s迁移数据类型对照及举例说明 最终结论:oracle与gbase8s数据类型对应关系关于单精度与双精度的区别关于定点与浮点定义的区别精度的定…...
Flink系列之:集合操作
Flink系列之:集合操作 一、集合操作二、UNION三、INTERSECT四、EXCEPT五、IN六、EXISTS 一、集合操作 适用于流、批操作 二、UNION UNION 和 UNION ALL 返回两个表中的数据。 UNION 会去重,UNION ALL 不会去重。 Flink SQL> create view t1(s) as…...
STL:string的常见用法
目录 赋值和连接: operator: 赋值操作符: assign(str): 将字符串赋值为另一个字符串: : 字符串连接操作符: 访问和检查: at(pos): 返回指定位置的字符,提供边界检查。 operator[]: 返回指定位置的字符…...
GBASE南大通用 ADO.NET 中的事务
GBASE南大通用 ADO.NET 中支持事务,可以使用GBASE南大通用Connection 对象的BeginTransaction 函数开始一个事务,并默认使用 ReadCommitted 模式初始化。 事务中可以对单个表执行多个操作,或者对多个表执行多个操作,在事务未提交…...
App(Android)ICP备案号查询——————高仿微信
😄 个人主页:✨拉莫帅-CSDN博客✨🤔 博文:132篇🔥 原创:130篇,转载:2篇🔥 总阅读量:388923❤️ 粉丝量:112🍁 感谢点赞和关注 &#x…...
修改npm源码解决服务端渲染环境中localstorage报错read properties of undefined (reading getItem)
现象: 这个问题是直接指向了我使用的第三方库good-storage,这是一个对localStorage/sessionStorage做了简单封装的库,因为项目代码有一个缓存cache.ts有用到 原因分析: 从表象上看是storage对象找不到getItem方法, 但…...
Educational Codeforces Round 160 (Div. 2) A~C(D,E更新中...)
A.Rating Increase(思维) 题意: 给出一个仅包含数字的字符串 s s s,要求将该字符串按以下要求分成左右两部分 a , b a,b a,b: 两个数字均不包含前导 0 0 0 两个数字均大于 0 0 0 b > a b > a b>a 如果…...
【Maven-Helper】利用 Maven-Helper 解决依赖冲突问题
【Maven-Helper】利用 Maven-Helper 解决依赖冲突问题 1)安装 Maven-Helper 插件2)Maven Helper 插件使用方法3)Idea-Maven 可视化依赖树 1)安装 Maven-Helper 插件 这里我们已经安装过了,如果没有安装过,点…...
C# WPF上位机开发(知识产权ip保护)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 上位机软件如果是和硬件模块搭配开发,这个时候大部分上位机基本上都是白送的,不会收取相关的费用。但是,如果上…...
【Jenkins】Pipeline 语法解析(声明式Pipeline)
文章目录 一、Sections1、agent(代理)agent 参数值 2、post3、stages(阶段)4、steps(步骤) 二、Directives 指令1、environment 环境变量2、options 配置选项可用的选项 options 3、parameters 参数可用的参…...
二叉树的最大深度(LeetCode 104)
文章目录 1.问题描述2.难度等级3.热门指数4.解题思路方法一:深度优先搜索GolangC 方法二:广度优先搜索GolangC 参考文献 1.问题描述 给定一个二叉树 root ,返回其最大深度。 叉树的「最大深度」是指从根节点到最远叶子节点的最长路径上的节…...
03-数据结构-栈与队列
1.栈 栈和队列是两种操作受限的线性表。如上图所示显示栈的结构 栈:先进后出,入栈(数据进入) 和出栈(数据出去)均在栈顶操作。 常见栈的应用场景包括括号问题的求解,表达式的转换和求值&#…...
功能测试转向自动化测试 。10 年 心路历程——愿测试人不再迷茫
十年测试心路历程: 由于历史原因,大部分测试人员,最开始接触都是纯功能界面测试,随着工作年限,会接触到一些常用测试工具,比如抓包,数据库,linux 等。 我大学学的计算机专业&#…...
VIM ——Vimtutor 个人总结【从入门到精通】
精进 Vim 编辑器技能:从入门到精通 文章目录 精进 Vim 编辑器技能:从入门到精通学习资源[Vim 自带教程中文版 —— vimtutor-CSDN博客](https://blog.csdn.net/qq_40395874/article/details/116047253)[Learn Vimscript the Hard Way (stevelosh.com)](h…...
gitea分支、合并
一、创建分支,推送到远程仓库 git branch dev git checkout dev 或者可以使用合并的命令来完成上述两个步骤: git checkout -b dev在新分支上进行修改、提交代码等操作 接下来,将新分支推送到远程仓库。使用git push命令,并…...
探究 JavaScript 类型检查的利器:typeof 和 instanceof
🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…...
VSCode报错插件Error lens
1.点击左侧扩展图标→搜索“error lens”→点击“安装” 2.安装成功页面如下: 3.代码测试一下:书写代码的过程中会出现红色提醒或红色报错 4.另外推荐小伙伴们安装中文插件,学习过程中会比较实用方便,需要安装中文插件的小伙伴请点…...
go-zero开发入门之gateway深入研究1
创建一个 gateway 示例: // main.go package mainimport ("flag""fmt""gateway/middleware""github.com/zeromicro/go-zero/core/conf""github.com/zeromicro/go-zero/gateway" )var configFile flag.String(&…...
Kazumi WebDAV同步功能详解:实现跨设备番剧数据互通的无缝体验
Kazumi WebDAV同步功能详解:实现跨设备番剧数据互通的无缝体验 【免费下载链接】Kazumi 基于自定义规则的番剧采集APP,支持流媒体在线观看,支持弹幕,支持实时超分辨率。 项目地址: https://gitcode.com/gh_mirrors/ka/Kazumi …...
OpenAirInterface (OAI) 实战:如何用USRP搭建你的第一个5G仿真环境(附避坑指南)
OpenAirInterface (OAI) 实战:如何用USRP搭建你的第一个5G仿真环境(附避坑指南) 当5G技术从实验室走向商业化时,开源软件无线电平台OpenAirInterface(OAI)正成为开发者验证创新想法的关键工具。不同于商业设…...
终极指南:如何构建现代化微服务架构 - Zend Framework Expressive完整教程
终极指南:如何构建现代化微服务架构 - Zend Framework Expressive完整教程 【免费下载链接】zendframework Official Zend Framework repository 项目地址: https://gitcode.com/gh_mirrors/ze/zendframework 在当今快速发展的微服务架构时代,PHP…...
PasteMD模板功能详解:创建个性化转换规则
PasteMD模板功能详解:创建个性化转换规则 你是不是经常从AI对话或者网页上复制内容到Word时,格式总是乱七八糟?公式变成乱码,表格错位,代码块失去高亮?PasteMD就是专门解决这个问题的神器,而它…...
Qwen3-14B私有部署镜像算法题求解助手:从理解到实现
Qwen3-14B私有部署镜像算法题求解助手:从理解到实现 1. 为什么算法工程师需要AI助手 算法工程师和求职者每天都要面对各种算法问题,从简单的排序到复杂的动态规划。传统方式下,我们需要反复查阅资料、手动编写测试用例、调试代码࿰…...
InternLM2-Chat-1.8B助力在线教育:个性化作业批改与学习反馈生成
InternLM2-Chat-1.8B助力在线教育:个性化作业批改与学习反馈生成 1. 引言:当作业批改遇上AI 想象一下,一位老师深夜还在批改几十份、甚至上百份学生作业。面对相似的错误,需要一遍遍写下相同的评语;面对有潜力的答案…...
正交试验DOE在算法参数优化中的高效应用
1. 正交试验DOE:算法调参的"聪明捷径" 第一次接触算法参数优化时,我像大多数人一样陷入了暴力搜索的陷阱。记得当时调一个简单的随机森林模型,5个参数各试5个值,总共需要3125次训练!直到发现正交试验设计&am…...
Graphormer开源可部署意义:支撑国家AI for Science重大科技基础设施
Graphormer开源可部署意义:分子属性预测使用指南 1. 项目概述 Graphormer是一种基于纯Transformer架构的图神经网络模型,专门为分子图(原子-键结构)的全局结构建模与属性预测而设计。该模型在OGB、PCQM4M等分子基准测试中表现优…...
西门子博图V16实战:5种工作模式机械手PLC程序全解析(附HMI组态文件)
西门子博图V16实战:5种工作模式机械手PLC程序全解析(附HMI组态文件) 在工业自动化领域,机械手控制系统一直是核心难点之一。如何实现多工作模式的灵活切换、确保信号互锁安全可靠,是每个PLC程序员必须掌握的技能。本文…...
【SLAM实战解析】卡方检验在ORB-SLAM2外点剔除中的关键作用
1. 卡方检验在SLAM中的核心价值 第一次在ORB-SLAM2的代码里看到卡方检验时,我盯着那行chi2测试代码愣了半天。这个在统计学课本里见过的概念,怎么突然出现在视觉SLAM系统中?后来才发现,这简直是SLAM开发者处理异常值的"瑞士军…...
