数据结构(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(&…...
大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...
深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...
Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
[论文阅读]TrustRAG: Enhancing Robustness and Trustworthiness in RAG
TrustRAG: Enhancing Robustness and Trustworthiness in RAG [2501.00879] TrustRAG: Enhancing Robustness and Trustworthiness in Retrieval-Augmented Generation 代码:HuichiZhou/TrustRAG: Code for "TrustRAG: Enhancing Robustness and Trustworthin…...
2025年低延迟业务DDoS防护全攻略:高可用架构与实战方案
一、延迟敏感行业面临的DDoS攻击新挑战 2025年,金融交易、实时竞技游戏、工业物联网等低延迟业务成为DDoS攻击的首要目标。攻击呈现三大特征: AI驱动的自适应攻击:攻击流量模拟真实用户行为,差异率低至0.5%,传统规则引…...
