数据结构(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,在函数参数中使用引用时,我们不需要在调用函数中再次使用&符号,因为在定义函数的时候已经定义了该参数需要引用。

可以敲敲代码试一下!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/286580.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Next.js 学习笔记(三)——路由

路由 路由基础知识 每个应用程序的骨架都是路由。本页将向你介绍互联网路由的基本概念以及如何在 Next.js 中处理路由。 术语 首先&#xff0c;你将在整个文档中看到这些术语的使用情况。以下是一个快速参考&#xff1a; 树&#xff08;Tree&#xff09;&#xff1a;用于可…

制造企业可以通过哪些措施改善设备OEE

设备综合效率OEE&#xff08;Overall Equipment Effectiveness&#xff09;是制造企业衡量设备效率的关键指标之一。高效的设备运行对于提高生产效率、降低成本和实现竞争优势至关重要。然而&#xff0c;实现高水平的设备OEE并不是一项简单的任务。本文将介绍一些制造企业可以采…

QT绘图类 QPixmap、QImage、QPicture、QBitmap

前言 绘图设备是指继承 QPaintDevice 的子类&#xff0c;你可以使用 QPainter 直接在其上面绘制图形&#xff0c;Qt 一共提供了四个这样继承 QPaintDevice 的绘图设备类&#xff0c;分别是&#xff1a;QPixmap、QBitmap、QImage和 QPicture。其中&#xff1a; QPixmap是为在屏…

广州华锐互动 | VR稀有金属冶炼业职业危害教学系统

虚拟现实&#xff08;VR&#xff09;技术在许多领域都得到了广泛的应用&#xff0c;其中包括职业病危害培训。对于稀有金属加工场所来说&#xff0c;VR技术可以提供一种全新的、高效的培训方式&#xff0c;帮助员工了解和预防职业病的危害。 传统的职业病危害培训通常需要大量的…

TrustZone之顶层软件架构

在处理器中的TrustZone和系统架构中,我们探讨了硬件中的TrustZone支持,包括Arm处理器和更广泛的内存系统。本主题关注TrustZone系统中发现的软件架构。 一、顶层软件架构 下图显示了启用TrustZone的系统的典型软件栈: 【注意】:为简单起见,该图不包括管理程序,尽管它们可…

html行内元素和块级元素的区别?

HTML中的元素可以分为两种类型&#xff1a;行内元素&#xff08;inline&#xff09;和块级元素&#xff08;block&#xff09; 文章目录 什么是行内元素什么是块级元素元素转换行内元素转块级元素块级元素转行内元素 区别总结 什么是行内元素 HTML的行内元素&#xff08;inli…

【23真题】第七题90%做错,搞心态!

哈喽大家好&#xff0c;现在这个时间节点&#xff0c;有很多同学开始刷真题了&#xff01;所以23真题系列正式启动&#xff01;小马哥将全面发布23真题及详细解析&#xff01; 今天分享的是23年山东师范大学850的信号与系统回忆版试题及解析。这套是好久之前答应了梦马班的同学…

PowerShell实战(一)PowerShell使用ImportExcel模块轻松操作Excel

目录 一、介绍 二、安装模块 三、操作示例 1、导出excel 2、读取Excel数据 3、导出包含图表的Excel 4、导出包含汇总列和图表的Excel 一、介绍 ImportExcel模块可以理解为基于PowerShell环境操作Excel的强大类库&#xff0c;使用它可以在 Windows、Linux 和 Mac 上都可以使用。…

100G光模块可以插40G端口吗?

传统数据中心主要依托10G网络架构运营。然而&#xff0c;为了适应AI、深度学习、大数据计算等业务的大规模部署需求&#xff0c;下一代数据中心架构正在向25G/100G网络架构转型。在国内&#xff0c;我们已经看到BAT等互联网领军企业实现了这种高带宽网络架构的规模化部署。 构…

Git初始

一)git的介绍: 1)假设现在有一个文档&#xff0c;你的老板要求你针对于这份文件进行修改&#xff0c;进行完成的修改的版本是版本1&#xff0c;接下来是文档2&#xff0c;修改完文档2以后&#xff0c;接下来老板还不同意&#xff0c;于是又有了文档三&#xff0c;文档四&#x…

ModuleNotFoundError: No module named ‘openai.error‘

ModuleNotFoundError: No module named ‘openai.error’ result self.fn(*self.args, **self.kwargs) File “H:\chatGPTWeb\chatgpt-on-wechat\channel\chat_channel.py”, line 168, in _handle reply self._generate_reply(context) File “H:\chatGPTWeb\chatgpt-on-wec…

08_CMDB系统开发二

CMDB系统开发二 一、用户组管理模块 1、展示用户组列表 Django自带了用户表&#xff0c;同时也带了用户组表。他们是多对多关系。用户组模型很简单&#xff0c;和User模型是多对多的关系。用户组顾名思义&#xff0c;就是对用户进行了分组。其作用在权限控制中就是可以批量的…