数据结构(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(&…...
使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...
1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...
LabVIEW双光子成像系统技术
双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制,展现出显著的技术优势: 深层组织穿透能力:适用于活体组织深度成像 高分辨率观测性能:满足微观结构的精细研究需求 低光毒性特点:减少对样本的损伤…...
《Docker》架构
文章目录 架构模式单机架构应用数据分离架构应用服务器集群架构读写分离/主从分离架构冷热分离架构垂直分库架构微服务架构容器编排架构什么是容器,docker,镜像,k8s 架构模式 单机架构 单机架构其实就是应用服务器和单机服务器都部署在同一…...
嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)
目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 编辑编辑 UDP的特征 socke函数 bind函数 recvfrom函数(接收函数) sendto函数(发送函数) 五、网络编程之 UDP 用…...
医疗AI模型可解释性编程研究:基于SHAP、LIME与Anchor
1 医疗树模型与可解释人工智能基础 医疗领域的人工智能应用正迅速从理论研究转向临床实践,在这一过程中,模型可解释性已成为确保AI系统被医疗专业人员接受和信任的关键因素。基于树模型的集成算法(如RandomForest、XGBoost、LightGBM)因其卓越的预测性能和相对良好的解释性…...
