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

news2024/11/28 10:50:33

目录

顺序表的头插(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.coloradmin.cn/o/1659263.html

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

相关文章

Python嵌套绘图并为条形图添加自定义标注

论文绘图时经常需要多图嵌套&#xff0c;正好最近绘图用到了&#xff0c;记录一下使用Python实现多图嵌套的过程。 首先&#xff0c;实现 Seaborn 分别绘制折线图和柱状图。 绘制折线图import seaborn as snsimport matplotlib.pyplot as pltimport warningswarnings.filterw…

【日常开发之插件篇】IDEA plugins 神器助我!!

文章目录 Tabnine 代码自动补全图例 Rainbow Brackets图例 Translation 翻译配置 LombokAlibaba Java Coding Guidelines 阿里巴巴的编码规约检查插件 今早因为老代码的一些bug让我突然觉得Idea的一些插件特别好用&#xff0c;我准备将我平时所用到的一些插件做个推荐以及记录。…

全国智能网联汽车行业产教融合共同体成立, 经纬恒润当选常务理事单位

近日&#xff0c;全国智能网联汽车行业产教融合共同体&#xff08;以下简称“共同体”&#xff09;全体成员大会在湖南株洲隆重召开。湖南省教育厅职成处副处长殷劭&#xff0c;国家智能网联汽车创新中心常务副主任、国汽&#xff08;北京&#xff09;智能网联汽车研究院有限公…

可以录屏的软件推荐3款,让你的录制更高效!

在信息时代&#xff0c;数字化学习、远程办公等场景越来越普及&#xff0c;录屏软件已经成为了人们生活中不可或缺的一部分。一款好的录屏软件可以帮助用户轻松录制屏幕内容&#xff0c;以便随时回顾或与他人分享。本文将详细介绍三款可以录屏的软件&#xff0c;帮助读者了解它…

百度百科怎么创建自己

百度百科是一个向所有互联网用户开放的平台&#xff0c;人人都可以创建词条。以下是创建自己百度百科的步骤和注意事项。 创建步骤 注册百度账号&#xff1a;首先&#xff0c;你需要注册一个百度账号。如果已经有百度账号&#xff0c;可以直接登录。 选择百科类型&#xff1a;…

FPGA+海思ARM方案,可同时接收HDMI/VGA 两种信号,远程控制

FPGA海思ARM方案&#xff0c;可同时接收HDMI/VGA 两种信号&#xff0c;通过配置输出任一图像或者拼接后的图像 客户应用&#xff1a;无线远程控制 主要特性&#xff1a; 1.支持2K以下任意分辨率格式 2.支持H264压缩图像 3.支持WIFI/4G无线传输 4.支持自适应输入图像分辨率 …

4. 分布式链路追踪客户端工具包Starter设计

前言 本文将从零搭建分布式链路追踪客户端工具包的Starter&#xff0c;并将在后续文章中逐步丰富支持的场景。这里首先将搭建一个最基础的Starter&#xff0c;能提供的功能和1. 看完这篇文章我奶奶都懂Opentracing了一文中的示例demo类似。 相关版本依赖如下。 opentracing-…

三、四线城市也能开店做真人手办定制?会不会亏?

时下&#xff0c;真人手办定制项目加盟热&#xff0c;消费端需求伴随网络效应指数心增加&#xff0c;作为真人手办定制底层技术供应商&#xff0c;博雅仔在与一些创业中的伙伴的沟通过程中了解到&#xff0c;位于一、二线城市的伙伴朋友很有信心&#xff0c;他们坦言&#xff0…

教你免费通配符/泛域名SSL证书怎么申请

申请免费的通配符SSL证书可以让您的主域名及其所有二级子域名都受到安全套接层(SSL)的加密保护&#xff0c;提高网站的整体安全性和用户信任度。以下是一个基于通用流程的简明教程&#xff0c;以JoySSL为例&#xff0c;因为他提供全类别的免费SSL证书。 1、创建证书服务商账号…

STM32自制雾化器

1.1 介绍&#xff1a; 108KHZ雾化器&#xff0c;由驱动模块和雾化器组成&#xff0c;主要作用是把水雾化加湿&#xff1b;它的使用方法有两种&#xff1b;方式1.电源接口供电DC3-4.5V&#xff0c;按下按键&#xff0c;开启雾化器,再按住关&#xff1b;方式2.单片机控制低电平2…

Linux实验 系统管理(二)

实验目的&#xff1a; 了解RPM软件包&#xff1b;掌握使用rpm命令查询、安装、更新、卸载、验证软件包的方法&#xff1b;掌握使用yum命令查询、安装、更新、卸载软件包的方法&#xff1b;了解TAR软件包&#xff1b;掌握使用tar命令创建&#xff08;并压缩&#xff09;、查询、…

SSM校园疫情防控系统JAVA计算机毕业设计项目【附源码】

SSM校园疫情防控系统JAVA计算机毕业设计项目 &#x1f345; 作者主页 网顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; &#x1f345; 查看下方微信号获取联系方式 承接各种定制系统 &#x1…

python+cv2+gstreamer 推流<500ms低延迟的处理策略

1.一份可用的推流配置 self.out cv2.VideoWriter(appsrc is-liveTrue stream-type0 emit-signalsFalse max-latency1 \ ! videoconvert ! video/x-raw, formatI420 \ ! x264enc speed-presetultrafast bitrate1200 tune"zerolatency" key-int-m…

吉林事业编报名照要求<50kb怎么压缩

吉林事业编报名照要求&#xff1c;50kb怎么压缩

美港通正规股票炒股市场超100亿元!北上资金爆买A股!

查查配今日早盘,A股震荡上扬,上证指数再创年内新高,创业板指、科创50、沪深300等指数均涨超1%。 盘面上,新能源产业全线走强,锂电池、光伏、高压快充、储能等板块涨幅居前,ST、公共交通、通信设备、酿酒等板块小幅调整。 美港通证券以其专业的服务和较低的管理费用在市场中受…

2024年想要开一家抖音小店,需要多少钱?一篇详解!

大家好&#xff0c;我是电商糖果 随着抖音卖货的持续火爆&#xff0c;抖音小店也成了电商行业讨论度最大的项目之一。 不少朋友都想知道&#xff0c;如果今年开抖音小店大概需要多少钱。 糖果做小店的时间也比较长&#xff0c;也经营了多家小店。 对于开一家抖音小店需要多…

【深度学习】【Lora训练0】StabelDiffusion,Lora训练,kohya_ss训练

文章目录 环境数据自动标注kohya_ss BLIP2kohya_ss WD14 后续 资源&#xff1a; &#xff08;1&#xff09;训练ui kohya_ss&#xff1a; https://github.com/bmaltais/kohya_ss &#xff08;2&#xff09;kohya_ss 的docker 其他docker https://github.com/ashleykleynhans…

书生第三课作业

视频&#xff1a;https://www.bilibili.com/video/BV1QA4m1F7t4/ 教程&#xff1a;https://github.com/InternLM/Tutorial/blob/camp2/huixiangdou/readme.md 作业&#xff1a;https://github.com/InternLM/Tutorial/blob/camp2/huixiangdou/homework.md 项目地址&#xff1a;h…

基于Opencv的车牌识别系统(毕业设计可用)

系统架构 图像采集&#xff1a;首先&#xff0c;通过摄像头等设备捕捉车辆图像。图像质量直接影响后续处理的准确性&#xff0c;因此高质量的图像采集是基础。 预处理&#xff1a;对获取的原始图像进行预处理&#xff0c;包括灰度化、降噪、对比度增强和边缘检测等。这些操作旨…

什么是内存泄漏?什么是内存溢出?

我们讲内存溢出时&#xff0c;首先看一下上面这张图&#xff0c;比如说你要往一个500ml的杯子里倒800ml的水&#xff0c;这样肯定是装不下的&#xff0c;水会溢出来&#xff0c;在我们电脑内存中也是一样的&#xff0c;你这个内存中就只有5M的内存空间&#xff0c;可是你要将8M…