顺序表的实现(迈入数据结构的大门)(2)

目录

顺序表的头插(SLPushFront)

此时:我们有两个思路(数组移位)

顺序表的头删(学会思维的变换)(SLPopFront)

顺序表的尾插(SLPushBack)

有尾插就有尾删

既然头与尾部的插入与删除都有,那必然少不了指定位置的插入删除

查找目标值

指定位置插入(SLInsert)

指定位置删除(SLErase)

打印(顺序表的结尾之声)

书接上文

顺序表的头插(SLPushFront)

头插:

对于头插,我们需要先将数组头部的位置空余出来存放我们需要插入的数x;

所以我们需要将数组中的数向后移一位;

此时:我们有两个思路(数组移位)

1、从下标为0开始向后置换,此时会出现数值覆盖的问题,我们需要另创建一个变量(tmp)存放后一个值以防覆盖之后寻找不到;当tmp的下一个数组为NULL时;怎么办了?

这就要if语句判断或者使用while语句,那有什么方法能将此简化呢:这就来到第二个方法;

2、我们从数组末尾进行移位,这就防止了数值覆盖的问题,还不需要使用到其余语句的创建;

//头插
void SLPushFront(SL* ps, SLDataType x){
//记住SLDataType,这里为我们为了方便(typedef int SLDataType)assert(ps);//断言一下,防止指针为空SLCheckCapacity(&ps);//开辟空间int i = ps->size;for (; i > 0; i--);//从后往前移位{ps->a[i] = ps->a[i - 1];}ps->a[0] = x;//此时a[0]就空出来存放x;ps->size++;//不要忘记size需要++
}

顺序表的头删(学会思维的变换)(SLPopFront)

对于头删,我们需要删除下标为0的值,然后将值向前移一位,与头插类似,只不过,此时是从前往后移动;

//头删
void SLPopFront(SL* ps) {assert(ps);assert(ps->size);//存放的值不能为NULL;for (int i = 0; i < ps->size-1; i++) {ps->a[i] = ps->a[i + 1];}ps->size--;
}

顺序表的尾插(SLPushBack)

当我们学会了头插,顺序表的尾插相对我们来说,简直轻而易举

尾插:我们就要先判断是否还有空余位置,就要利用SLCheckCapacity(SL* ps);是否需要扩容

此时ps->size的位置如图所示,我们就可以直接将x的值赋给当前位置,然后ps->size++;

//尾插
void SLPushBack(SL* ps, SLDataType x) {assert(ps);void SLCheckCapacity(SL * ps);ps->a[ps->size++] = x;//相当于ps->a[ps->size] = x;//ps->size++;
}

有尾插就有尾删

思考一下,尾删,我们将ps->size-1的位置删除:将其置为NULL,ps->size--,就完成了尾删;

那我们换一个思路,我们只将这个位置删除,是否可以,直接ps->size--呢:因为当我们打印的时候只需打印[0,size)之间的数,size这个位置需要打印吗?当然不用啦;如果我们需要尾插的时候呢,我们可以直接将此位置覆盖掉;

//尾删
void SLPopBack(SL* ps) {assert(ps);assert(ps->size);//进行尾删,必须存在尾删的值ps->size--;
}

既然头与尾部的插入与删除都有,那必然少不了指定位置的插入删除

查找目标值

对于查找数组中的值时,一般使用遍历查询;

//查找
int SLFind(SL* ps, SLDataType x) {assert(ps);for (int i = 0; i < ps->size; i++) {//对数组进行遍历if (ps->a[i] == x) {return i;}}return -1;//循环结束,没有找到,返回-1;
}

指定位置插入(SLInsert)

指定位置插入与头插相似,需要将指定位置后的值向后移移位,在进行插入;

//注意:这里的pos对应数组下标

//指定位置插入
void SLInsert(SL* ps, int pos, SLDataType x) {assert(ps);assert(pos >= 0 && ps->size > pos);//pos必须在含有值之间插入//插入数据:空间够不够SLCheckCapacity(ps);//让pos及之后的数据整体往后挪动一位for (int i = ps->size; i > pos; i--){ps->a[i] = ps->a[i - 1];//a[pos+1] = a[pos]与头插具有相似之处,导致值的覆盖}ps->a[pos] = x;//这里的pos对应,数组下标,如果不对应,则按情况+-;ps->size++;
}

指定位置删除(SLErase)

//删除指定位置的数据
void SLErase(SL* ps, int pos)
{assert(ps);assert(pos >= 0 && pos < ps->size);//与头删类似for (int i = pos; i < ps->size - 1; i++){ps->a[i] = ps->a[i + 1];}ps->size--;
}

打印(顺序表的结尾之声)

这里我们要注意结构体访问成员的方式 ( . )  ( -> )

C语言结构体—自定义类型—struct-CSDN博客

void SLPrint(SL s)//对于打印数组,这里不再需要传地址,而是传值
{for (int i = 0; i < s.size; i++){//对于结构体的使用  (.)与(->)的不同printf("%d ", s.a[i]);}printf("\n");
}

以上我们完成了顺序表的实现,下一节我们将实现(通讯录)顺序表


看到这里就点个赞走吧!!!

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

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

相关文章

特征提取与深度神经网络(二)

关键点/角点检测 2011论文-ORB关键点检测&#xff0c;比SIFT与SURF速度更快。 ORB算法可以看出两个部分组成&#xff1a;快速关键点定位BRIEF描述子生成 Fast关键点检测&#xff1a; 选择当前像素点P&#xff0c;阈值T&#xff0c;周围16个像素点&#xff0c;超过连续N12个像素…

Flutter笔记:Widgets Easier组件库 - 使用标签(Tag)

Flutter笔记 Widgets Easier组件库 - 使用标签&#xff08;Tag&#xff09; - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this …

电路板维修【一】

最近喜欢上了电路板维修&#xff0c;经常看很多博主的维修视频&#xff0c;觉得还是颇有收获的&#xff08;维修板子原来有方法可循&#xff09;&#xff0c;于是做笔记如下&#xff1a; 一.【修了半天也没找到问题&#xff0c;原来是检查方向错了&#xff0c;变频油烟机板维修…

LifeCycle之ProcessLifeCycleOwner

问题&#xff1a;想要知道应用程序当前处在前台、后台、或从后台回到前台&#xff0c;想要知道应用的状态&#xff0c; LifeCycle提供了ProcessLifeCycleOwner的类&#xff0c;方便我们知道整个应用程序的生命周期情况 ProcessLifeCycleOwner 使用方法 1.首先添加依赖 imple…

如何设置内网打印机端口网络穿透到公网

打印机是当前公司企业办公输出纸质文件处理过程中必不可少的工具设备。出差在外&#xff0c;我们经常会面对需要远程使用公司内部打印机复印或打印各种文件资料的情况&#xff0c;或不在家又需要远程访问家里打印机进行打印的情况。这时候&#xff0c;就必须学会远程打印的方法…

C++类和对象(三) 缺省值 | static成员 | 内部类

前言&#xff1a; 这是关于类和对象的最后一篇文章&#xff0c;当然还是基础篇的最后一篇&#xff0c;因为类的三大特性继承&#xff0c;封装和多态都还没有讲&#xff0c;少年&#xff0c;慢慢来。 缺省值&#xff1a; 之前讲过&#xff0c;在C11的新标准中&#xff0c;支持为…

vue3 - 图灵

目录 vue3简介整体上认识vue3项目创建Vue3工程使用官方脚手架创建Vue工程[推荐] 主要⼯程结构 数据双向绑定vue2语法的双向绑定简单表单双向绑定复杂表单双向绑定 CompositionAPI替代OptionsAPICompositionAPI简单不带双向绑定写法CompositionAPI简单带双向绑定写法setup简写⽅…

【机器学习之 sklearn 基础教程】

文章目录 机器学习之 sklearn 基础教程1. 引言2. 安装 sklearn3. 数据集3.1 加载数据集3.2 数据集划分 4. 数据预处理4.1 特征缩放4.2 编码分类特征 5. 模型训练与评估5.1 模型训练5.2 模型评估5.3 交叉验证 6. 模型调参7. 模型调参&#xff08;续&#xff09;7.1 GridSearchCV…

【C++后端项目】负载均衡OJ服务器

文章目录 一、演示项目二、所用技术与开发环境所用技术开发环境 三、项目宏观结构I. 风格&#xff1a;仿leetcodeII. 结构&#xff1a;Browser-Server模式III. 编写思路&#xff1a;编译服务 -> OJ服务 -> 前端设计 四、关于Git分支管理✨4.1 Git 分支结构4.2 Git 分支命…

mac电脑如何安装java

1、检查当前系统的 Java 版本 打开终端,输入以下命令查看当前 Java 版本 /usr/bin/java -version 2、前往 Java 官网下载 Java JDK 打开 Java 官网 (https://www.java.com/zh-CN/download/) 并下载最新版本的 Java JDK。 3、安装 Java JDK 双击下载的 .dmg 文件启动安装程序…

Springboot集成Netflix-ribbon、Consul实现负载均衡调用-09

Consul简介 Consul是一个开源的服务发现和配置管理工具&#xff0c;具有跨平台、运行高效等特点。它由HashiCorp公司开发&#xff0c;并使用Go语言编写。Consul主要用于实现分布式系统中的服务发现、健康检查、键值存储等功能。 核心功能 服务发现&#xff1a;Consul通过DNS…

Node.js版本管理工具nvm安装

1.下载nvm https://github.com/coreybutler/nvm-windows/releaseshttps://github.com/coreybutler/nvm-windows/releases 2.安装nvm 双击打开下载好的压缩包解压出的文件 目录中不要有中文 这个是配置切换node版本后的存储位置 然后一路下一步就行了 3.安装并使用node 安装…

LPDDR5电路设计的新功能

最近因为需要使用到LPDDR5&#xff0c;快速地浏览了JEDEC标准文档&#xff0c;发现与前几代相比出现了一些新的电路设计功能&#xff0c;总结为如下三点&#xff1a; 1. CK/WCK/RDQS时钟方案&#xff1b; 2. 电源的PDN设计目标&#xff1b; 3. DQ, DMI和RDQS的Rx端DFE均衡技术。…

LLM大语言模型(十五):LangChain的Agent中使用自定义的ChatGLM,且底层调用的是remote的ChatGLM3-6B的HTTP服务

背景 本文搭建了一个完整的LangChain的Agent&#xff0c;调用本地启动的ChatGLM3-6B的HTTP server。 为后续的RAG做好了准备。 增加服务端role&#xff1a;observation ChatGLM3的官方demo&#xff1a;openai_api_demo目录 api_server.py文件 class ChatMessage(BaseModel…

Unity 性能优化之GPU Instancing(五)

提示&#xff1a;仅供参考&#xff0c;有误之处&#xff0c;麻烦大佬指出&#xff0c;不胜感激&#xff01; 文章目录 前言一、GPU Instancing使用方法二、使用GPU Instancing的条件三、GPU Instancing弊端四、注意五、检查是否成功总结 前言 GPU Instancing也是一种Draw call…

AppImage 创建快捷方式

AppImage是什么&#xff1f; AppImage 是一个可下载的 Linux 文件&#xff0c;它内部包含一个应用程序和应用程序所需的一切&#xff08;库、图标、字体等&#xff09;。 官网 https://appimage.org/ 如何运行 AppImage 很简单&#xff0c;下载一个 AppImage&#xff0c;给…

PowerShell ⇒ Excel 批量创建Excel

New-Object -ComObject Excel.Application&#xff1a;创建Excel对象[System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel) | Out-Null 用来显式释放 Excel COM 对象的资源&#xff0c;以确保在脚本执行完成后&#xff0c;释放 Excel 进程和相关资源&#xff0…

揭秘:让代码更优雅的七大面向对象设计秘诀

软件项目中&#xff0c;需求是不断变化的&#xff0c;需求也是项目中最难把控的&#xff0c;需求的变更也是无法避免的。我们写的软件程序&#xff0c;如何能实现拥抱变化&#xff0c;使我们的软件达到可维护和可复用&#xff0c;这是一代代软件工程师不断追寻的真理。 导致一个…

接口数据脱敏实现方案

背景 敏感信息如手机号、身份证、邮箱等信息需要脱敏后展示给前台&#xff0c;如果需要查看&#xff0c;则需要申请权限&#xff0c;查询时需要记录操作日志。 方案 通过JsonSerializer和注解&#xff0c;在json序列化的时候做脱敏操作 此处使用redis存储了加密后的key和明…

认养小游戏功能介绍

认养小游戏通常模拟了真实的农业生产过程&#xff0c;让玩家能够在线上体验种植、养殖的乐趣。以下是一些常见的认养小游戏功能介绍&#xff1a; 选择认养的农产品&#xff1a;首先&#xff0c;玩家可以从游戏中提供的多种农产品中选择自己想要认养的种类&#xff0c;如蔬菜、…