C语言实现顺序表(pushback pushfront popback popfront insert erase find)

news2024/11/26 18:28:19

顺序表,是常用的一种数据结构,他的底层是连续的物理内存,所以他可以在O(1)的时间访问下标为N的位置,而且很多操作都是基于顺序表才可以操作的,例如:排序

所以顺序表是很重要的,他和链表各有优点,正因为他的底层是连续的物理空间,所以他并不适合头插和头删,以及中间插入删除等

下面我们就来看一下顺序表如何实现

首先我们来看一下,顺序表的结构

e0cd0e2fdc0a45e99f4245a84907fe60.png

 我们定义一个顺序表,该顺序表有一个DataType类型的一个指针,我们可以给这个指针后面开辟一段连续的空间,用这段空间来存储数据,里面的size是用来记录当前顺序表中有多少个元素,而capacity是用来记录当前顺序表的最大存储容量。

我们把该结构体typedef一下,可以给他重命名,叫做SL

下面我们看一下后面需要实现的,关于顺序表的函数

db8da3ab82e24b5db2e4664eab45d9d1.png

 其中有初始化,销毁,尾插,头插,尾删,头删,还有随机插入,随机删除,还有打印顺序表,和查找函数

下面我们看一下第一个,初始化函数2a246d5ad48f492984230c98f276c9a8.png

 

下面我们看一下,初始化函数,初始化函数里面只需要把该变量中的指针a先开辟一小段空间,所以我们需要决定,刚开始有多少空间,然后我们把size初始化为0,我们在把capacity初始化为,刚开始可以最大存入数据的个数,我们把刚开始最大存入数据的个数初始化为4即可

既然有初始化,而且里面的内存是我们malloc主动开辟的,所以最后我们一定需要释放掉开辟的空间,所以我们需要一个销毁函数 82790824b52b4c7aa39a97deb29b9caf.png

而销毁函数很简单,我们只需要把变量中的a指针指向的那一段空间释放掉即可,同时把capacity和size设置为0即可

下面我们看一下尾插

 f14f6fa400544ca1b606da8a044655df.png

我们先看一下尾插,尾插 ,既然是插入,那么我们当然得先检查一下容量是否足够,如果足够的话我们直接插入即可,如果不够的话我们就需要扩容之后再插入进去,所以我们需要一个检查容量的函数,等检查之后再插入即可

所以我们看一下如何检查容量,如果容量足够怎么办?如果容量不够怎么办?以及如果不够的话怎么扩容?

4875c35ad2aa41468558c372bab633ca.png

我们首先进去,检查size是否和capacity相等,如果相等的话就说明已经满了,如果不想等的话,说明没有满,直接return就行,那么满了,我们就可以进行扩容,所以我们需要用到一个函数realloc该函数需要传入,想要扩容的指针,在传入想要扩容后的大小,他的返回值是该空间的起始位置,所以我们需要接收一下,判断是否为空,如果为空的话则失败,退出即可,如果成功的话把a重新赋值为tmp变量,然后再把capacity重新设置为扩容后的大小。

等扩容后,我们就可以直接插入就可以了,所以我们看一下插入

b9ac48c3a0534581a74bda8365ef2ba8.png

尾插,我们直接在size那个位置插入,然后再让size+1 就可以了

下面我们看一下尾删

2b93115400d64acb890e21fb4305d3f6.png 

其实尾删特别简单,我们并不需要把最后一个数字设置为0在删除,我们顺序表中查看有多少数据,并不是看里面的元素,我们用的是size,有多少个size,我们就认为有多少个数据,所以我们只需要让size-1就可以了了

下面我们看一下打印函数

 4368c0bb1bd24984a5cf459c0952caff.png

我们在顺序表中看有多少数据需要用到的是size,所以我们只需要打印size个数据就可以了,这样我们就可以使用一个循环打印就可以了

下面我们看一下头插

头插其实也并不难,我们先想一下,如果我们需要在前面插入一个数据,那么我们需要怎么做?

06e43b3eb9954037b10a14e1a2016b05.png

首先我们需要看一下,我们如何插入,既然是头插,那么我们当然是要让刚开始的位置有一个空余的位置,所以现在我们需要将顺序表中的数据都向后移动一个

4c83553e4917484ea04d4f91b1bbba7e.png 

就像这样,我们就可以把他空出来一个位置,然后插入进去就可以了 

下面我们看一下头删

aa139cd37f7e4afab6a8ab7ebb5bd977.png

如果我们需要删除第一个数据,那么我们并不需要真正的删除,我们只需要让他覆盖就可以了,我们可以把第二个放在第一个把第三个放在第二个,把第n个放在n-1个位置即可

所以我们来看一下

 f1733c6e5bae47db82881ddfa2f82922.png

就这样我们一个一个移动

ddc679c9c24f4b659717399fdc7d50e5.png 

e2a1d829151e48c7b199c02349effca0.png 

就像这样,我们最后会变成这样,我们只需要让size在减1就可以了

我们在看一下随机插入删除

078249322ff44edea5f3a879c9c960d6.png 

随机删除,就是传入要删除的位置,然后也是像头删一样覆盖就可以了,只不过这一次的位置不是覆盖第一个位置,而是覆盖到要删除的位置

49abe00605bd4b76baf27f5a3e1d10ed.png 

随机插入也是相同的,所以我们只需要把想要插入的位置空开就可以了,像头插一样 

最后我们来看一下find

6bab3522e7464aa08f50fbcc74a4d22f.png

我们查找只需要一个一个查找就可以了,如果相同的话则返回该位置数组的下标,如果没有的话就返回-1就可以了

这个就是今天的顺序表 

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

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

相关文章

taobao.item.update.listing( 一口价商品上架 )

¥开放平台基础API必须用户授权 单个商品上架输入的num_iid必须属于当前会话用户 公共参数 请求地址: HTTP地址 http://gw.api.taobao.com/router/rest 公共请求参数: 请求参数 响应参数 点击获取key和secret 请求示例 TaobaoClient client new DefaultTaobaoCl…

SpringBoot入门 - 定制自己的Banner

我们在启动Spring Boot程序时,有SpringBoot的Banner信息,那么如何自定义成自己项目的信息呢?什么是Banner我们在启动Spring Boot程序时,有如下Banner信息:那么如何自定义成自己项目的名称呢?如何更改Banner…

一天约了4个面试,复盘一下面试题和薪资福利

除了最新的面经分享,还有字节大佬的求职面试答疑,告诉你关键问题是什么?少走弯路。**另外本文也汇总了6份大厂面试题:字节、腾讯、小米、腾讯云、滴滴、小米游戏。**希望对大家有帮助。 前言 昨天我的交流群里,有位宝…

【学习笔记】深入理解JVM之对象的实例化

参考尚硅谷JVM 102 - 106 集 首发地址:地址 1、JVM对象的实例化 1.1 对象的创建方式 对象有一下几种创建对象的方式 new Object object new Object();Class的newInstance() Object object Object.class.newInstance();Constructor的newInstance&#xff08…

精选博客系列|公用事业中的VMware:在边缘重新定义价值

VMware 已经成为公用事业行业的核心。您可以在那里找到例如 VMware vSphere(包括基础 Hypervisor ESXi 和 VMware vCenter 建立的整体控制平面)的核心产品。来自软件定义的基础架构带来的诸多好处使 IT 团队将其先前基于硬件的系统转变为 VMware Cloud F…

GPT+时代来临:OpenAI开放GPT3.5模型,1000token仅1毛钱

GPT3.5 Model API 使用指南 今天OpenAI公司开放了最新的GPT3.5模型:gpt-3.5-turbo,也就是目前网页版的ChatGPT使用的模型。而此前OpenAI开放的最新的模型text-davinci-003则是基于GPT3模型构建的。并且价格十分便宜:1000 token/0.002美元&am…

CVE-2021-2109 WebLogic JNDI 注入

0x01 前言学习一下 WebLogic JNDI 注入 RCE(CVE-2021-2109)0x02 环境搭建和之前 WebLogic 的环境搭建是一致的,本文不再赘述。不过值得一提的是,我的 weblogic 版本是 10.3.6;需要手动添加 \server\lib\consoleapp\web…

打电话,玩手机、摔倒行人行为识别

文章大纲 数据集准备一些难点paddle 解决方案行为识别打电话摔倒开源解决方案前文: 深度学习与视频分析简介视频分析:基于目标检测(YOLO)实现走路看手机检测、玩手机检测、跌倒检测等数据集准备 我们可以从开源数据中挑选一些 参考文章: 使用python 脚本挑出coco 数据集…

【C++的OpenCV】第九课-OpenCV图像常用操作(六):图像形态学-阈值的概念、功能及操作(threshold()函数))

目录一、阈值(thresh)的概念二、阈值在图形学中的用途三、阈值的作用和操作3.1 在OpenCV中可以进行的阈值操作3.2 操作实例3.2.1 threshold()函数介绍3.2.2 实例3.2.3 结果上节课的内容(作者还是鼓励各位同学按照顺序进行学习哦)&…

易基因|m6A RNA甲基化研究的数据挖掘思路:干货系列

大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。关于m6A甲基化研究思路(1)整体把握m6A甲基化图谱特征:m6A peak数量变化、m6A修饰基因数量变化、单个基因m6A peak数量分析、m6A peak在基因元件上的分布…

IP协议的漏洞及防护措施

文章目录一、TCP/IP协议族二、IP协议三、IP协议的安全问题及防护措施一、TCP/IP协议族 二、IP协议 网际协议(Internet Protocol,IP)是TCP/IP协议族的核心,也是网际层最重要的协议。 IP数据报由首部和数据两部分组成&#xff1b…

Spark性能优化五 算子优化

文章目录(一)map 和 mapPartitions(二)foreach 和 foreachPartition(三)repartition的使用(四)reduceByKey 和 groupByKey的区别(一)map 和 mapPartitions m…

解决Visual C++ Redistributable安装找不到vc_runtimeMinimum_x86.msi最简单办法

今天在安装Fritzing的时候,遇到了需要Visual C Redistributable支持包,所以就动手安装,发现居然不能安装,安装几次居然错误提示所需要的安装包*.MSI的居然名称还不用。我也是下载了各种版本来试图靠运气过关,结果失败告…

Linux下安装prometheus grafana

1 安装prometheus1.1 下载prometheus下载地址https://prometheus.io/download/#prometheus下载wget https://github.com/prometheus/prometheus/releases/download/v2.42.0/prometheus-2.42.0.linux-amd64.tar.gz1.2 安装# 新建目录,并进入目标目录 mkdir -p /middl…

Java语言如何求平方根

问题 在编程时,会遇到求平方根的问题,本次问题讲到如何使用Java来求解平方根。 方法 使用java.lang.Math类的sqrt(double)方法求平方根。Math是java.lang包中的类,所以就可以直接使用这个类。Double为对象中的基本类型。例如求正整数16的平方…

Vue 2

文章目录1. 简介2. 第一个Vue程序3. 指令3.1 判断循环3.2 操作属性3.3 绑定事件3.4 表单中数据双向绑定3.5 其他内置指令3.6 自定义指令4. 组件4.1 全局注册4.2 局部注册4.3 组件通讯4.4 单文件组件5. 组件插槽5.1 单个插槽5.2 具名插槽5.3 作用域插槽6. 内置组件6.1 component…

智能客服系统:为企业提升客户满意度

随着科技的不断进步,电话营销、呼叫中心机器人、语音自助服务等领域的智能客服系统也得到了飞速的发展。这些技术的出现,让企业能够更加高效地管理客户服务,提高客户满意度,从而在市场竞争中占据优势。 电话营销是企业推广产品、服…

g2o源码阅读

之前写的g2o源码阅读笔记,分享给有需要的人 整个文档请自行下载,这里只贴一个图片。

微信小程序第一节 —— 自定义顶部、底部导航栏以及获取胶囊体位置信息。

一、前言 大家好!我是 是江迪呀。我们在进行微信小程序开发时,常常需要自定义一些东西,比如自定义顶部导航、自定义底部导航等等。那么知道这些自定义内容的具体位置、以及如何适配不同的机型就变得尤为重要。下面让我以在iPhone机型&#x…

Word处理控件Aspose.Words功能演示:使用 C# 拆分 MS Word 文档

Aspose.Words 是一种高级Word文档处理API,用于执行各种文档管理和操作任务。API支持生成,修改,转换,呈现和打印文档,而无需在跨平台应用程序中直接使用Microsoft Word。此外, Aspose API支持流行文件格式处…