数据结构(2)——顺序表的模拟实现

一:顺序表的认识

通过数据结构(1)对于算法复杂度的理解,现在我们正式进入数据结构的核心内容,今天,先来使用C语言实现一下数据结构中最简单的顺序表。

首先介绍一下顺序表的概念,先从线性表说起。

线性表:n个具有相同结构的数据元素的有限序列。在逻辑结构上一定是线性的,在物理结构上不一定是线性的。

顺序表:如果线性表的物理地址连续,那么其就算是顺序表。一般情况下采用数组存储。

顺序表的底层逻辑就是数组。但相较于数组,它增添了一些功能。

也就是对数组进行一系列的功能包装,就形成了顺序表。

顺序表————>(数组+增加数据+修改数据+删除数据+查找数据……)

二:静态顺序表

如果数据地个数你是可以确定或者精确估计的,那么对于这样的一系列数据的存储就可以使用静态顺序表来完成。

比如:你要存储90个整型的数据,那么你就可以一次性创建一个容量为100个(大于90个)整型数据的数组(防止估计误差)来进行存储。还要有一个变量size来统计数组中有效数据的个数。

我们可以使用结构体来进行实现

静态顺序表的缺点:

1.空间给小了 后期空间不够用了:会造成新注册用户数据的遗失。

2.空间给大了:浪费空间(费钱),卡顿,……

总之使用静态顺序表这一数据结构存储数据不够灵活,使用频率相对较少。

怎么解决静态顺序表不够灵活等一系列问题呢?

接下来引入动态顺序表————

三:动态顺序表

由于静态顺序表开辟内存后就不能进行调整了,使用起来不够方便,因此我们创建动态顺序表来存储数据,可以使用动态内存开辟函数对内存进行调整。

接下来我要带领大家用C语言的方式来模拟实现一下动态顺序表的一系列功能。

我将采取多文件的形式(SeqList.h头文件 来进行结构的定义和函数的声名等)(SeqList.c 源文件来进行函数体的内容实现)(test.c 源文件来进行功能的测试)

1.动态顺序表的创建

相较于静态顺序表,动态顺序表由于其存储空间可变,需要额外一个变量capacity来标记存储空间的大小。

这里注意一下:使用typedef重定义的原因:

1.对int重定义:由于顺序表能够存储的数据类型不仅仅是整型,这里只是以整型为例来模拟实现顺序表的功能,之后但凡要使用顺序表存储其他类型的数据只需要将第七行的ing改为其他类型即可。

2.对struct SeqList重定义:为了后续书写方便。

2.初始化

顺序表使用之前要先对其中成员进行初始化,否则其成员会是随机值,有潜在的风险。

初始化的时候一定要传地址,传值的话起不到初始化的效果(具体原因参考我之前的博客)

3.判断内存空间是否够用

这里涉及一个问题,使用realloc函数扩容的话,如果每次只增加一个空间,会存在频繁扩容,频繁使用realloc函数程序执行效率会低下如果每次增加的空间比较大,会存在空间的浪费。

综合考虑,采取这样的扩容方式:每次扩容在原容量的基础上成二倍扩充(基于概率论)

5——10——20——40——80——160——320……

程序的第15行解释:如果size和capacity是相等的,说明数组有效数据个数和总数据个数相同,即空间已满,需要扩容。

程序的第17行解释:如果capacity是0,即一点空间都还没有开辟,那就先开辟4个整型空间使用(其实几个都无所谓,看自己习惯)。

4.尾插

尾插:在顺序表的尾部插入一个数据。

无论是尾插还是后面的头插,中间插入……只要涉及插入数据的操作就要先判断内存空间是否够用,不够用的话要先扩充空间。

这里要注意:插入数据之后size值要加一。

5.头插

想要在顺序表的头部插入数据,就要把顺序表整体向后移动,流出一个整型数据的空间。

把顺序表整体向后移动方法:从后向前依次后移(否则会发生覆盖)。

6.尾删

无论是尾删还是前删……只要设计删除数据就好提前考虑顺序表中是否有数据可删。

顺序表尾部删除数据其实操作很简单,只需要让size减一,要删除的那个数据就不再是有效数据了,其占据的空间就可以被尾插等操作使用。

7.头删

头删操作就是将顺序表从第二个数据开始一直到末尾,整体前移一位,将顺序表头部要删除的数据盖住。

这个操作要使用循环从前向后依次覆盖。

头删操作结束后size要减一。

8.查找

在顺序表中查找一个数据,如果找到,返回数据的下表,要是找不到返回-1;

9.指定位置之前插入数据

插入数据要先检查空间是否够用,然后将插入位置以及之后的数据从后向前依次后移一位。

这里要注意,插入数据的位置必须要在pos>=0&&pos<=size这个范围内。

pos=size就是尾插,pos=0就是头插。

10.删除指定位置的数据

删除数据时一定要检查是否有数据可以删。然后将删除的数据的位置之后的数据从前向后依次向前覆盖。

这里也要注意,删除的数据的位置必须要在pos>=0&&pos<=size这个范围内。

11.顺序表元素的打印

12.销毁

顺序表使用完毕之后要进行销毁(动态内存释放……)

以上就是动态顺序表的一些基础功能的模拟实现,当然顺序表的功能远不止这些,比如还有指定位置插入多个数据……,大家有兴趣的话可以自己下去尝试。

完:

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

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

相关文章

docker更换容器存储位置

一&#xff1a;原因 今天之前在某个服务器上使用docker搭建的服务突然无法访问了&#xff0c;进入服务器查看发现服务运行正常&#xff0c;但是就是无法使用&#xff0c;然后我这边准备将docker服务重新启动下看看&#xff0c;发现docker服务无法重启&#xff0c;提示内存已满…

Day5:生信新手笔记 — R语言基本语法

一、数据类型 &#xff08;重点只有两个&#xff0c;剩下的不看&#xff09; 1.1 向量&#xff08;vector&#xff09; 矩阵&#xff08;Matrix&#xff09; 数组&#xff08;Array&#xff09; 1.2 数据框&#xff08;Data frame&#xff09; x<- c(1,2,3) #常用的向…

【机器学习】窥数据之序,悟算法之道:机器学习的初心与远方

文章目录 机器学习入门&#xff1a;从零开始学习基础与应用前言第一部分&#xff1a;什么是机器学习&#xff1f;1.1 机器学习的定义1.1.1 举个例子&#xff1a;垃圾邮件分类器 1.2 机器学习的核心思想1.2.1 数据驱动的模式提取1.2.2 为什么机器学习比传统方法更灵活&#xff1…

Linux权限机制深度解读:系统安全的第一道防线

文章目录 前言‼️一、Linux权限的概念‼️二、Linux权限管理❕2.1 文件访问者的分类&#xff08;人&#xff09;❕2.2 文件类型和访问权限&#xff08;事物属性&#xff09;✔️1. 文件类型✔️2. 基本权限✔️3. 权限值的表示方法 ❕2.3 文件访问权限的相关设置方法✔️1. ch…

Ubuntu22.04系统源码编译OpenCV 4.10.0(包含opencv_contrib)

因项目需要使用不同版本的OpenCV&#xff0c;而本地的Ubuntu22.04系统装了ROS2自带OpenCV 4.5.4的版本&#xff0c;于是编译一个OpenCV 4.10.0&#xff08;带opencv_contrib&#xff09;版本&#xff0c;给特定的项目使用&#xff0c;这就不用换个设备后重新安装OpenCV 了&…

【C++】—— set 与 multiset

【C】—— map 与 set 1 序列式容器和关联式容器2 set 系列的使用2.1 set 和 multiset 参考文档2.2 set 类的介绍2.3 set 的迭代器和构造2.4 set的增删查2.4.1 insert2.4.2 find 与 erase2.4.3 count 2.5 lower_bound 与 upper_bound2.6 multiset 与 set 的差异2.6.1 不再去重2…

华为、华三交换机纯Web下如何创关键VLANIF、操作STP参数

华为交换机WEB操作 使用的是真机S5735&#xff0c;目前主流的版本都适用&#xff08;V1R5~V2R1的就不在列了&#xff0c;版本太老了&#xff0c;界面完全不一样&#xff0c;这里调试线接的console口&#xff0c;电脑的网络接在ETH口&#xff09; 「模拟器、工具合集」复制整段内…

学习threejs,使用canvas更新纹理

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️Texture 贴图 二、&#x1…

Redis设计与实现读书笔记

Redis设计与实现读书笔记 Redis设计与实现[^1]简单动态字符串SDS的基础定义与C字符串的差别常数获取长度杜绝缓冲区溢出减少修改字符串时带来的内存重分配次数二进制安全函数兼容 链表链表和链表节点的实现 字典字典的实现哈希表定义哈希表节点定义字典定义 哈希算法解决键冲突…

【笔记】离散数学 1-3 章

1. 数理逻辑 1.1 命题逻辑的基本概念 1.1.1 命题的概念 命题&#xff08;Proposition&#xff09;&#xff1a;是一个陈述句&#xff0c;它要么是真的&#xff08;true&#xff09;&#xff0c;要么是假的&#xff08;false&#xff09;&#xff0c;但不能同时为真和假。例如…

SQL SERVER 2016 AlwaysOn 无域集群+负载均衡搭建与简测

之前和很多群友聊天发现对2016的无域和负载均衡满心期待&#xff0c;毕竟可以简单搭建而且可以不适用第三方负载均衡器&#xff0c;SQL自己可以负载了。windows2016已经可以下载使用了&#xff0c;那么这回终于可以揭开令人憧憬向往的AlwaysOn2016 负载均衡集群的神秘面纱了。 …

浅谈——Linux命令入门之前奏

目录 一、备份操作系统 1、快照 2、克隆 二、操作系统的使用注意 1、Linux严格区分大小写 2、Linux 文件“扩展名” 3、Linux 中所有的内容以文件的形式进行保存 4、Linux 中所有的存储设备都必须挂载之后才能使用 5、Linux 系统文件目录的结构 6、Linux 系统文件的目…

matlab中disp,fprintf,sprintf,display,dlmwrite输出函数之间的区别

下面是他们之间的区别&#xff1a; disp函数与fprintf函数的区别 输出格式的灵活性 disp函数&#xff1a;输出格式相对固定。它会自动将变量以一种比较直接的方式显示出来。对于数组&#xff0c;会按照行列形式展示&#xff1b;对于字符串&#xff0c;直接原样输出并换行。例如…

计算机视觉——相机标定(Camera Calibration)

文章目录 1. 简介2. 原理3. 相机模型3.1 四大坐标系3.2 坐标系间的转换关系3.2.1 世界坐标系到相机坐标系3.2.2 相机坐标系到图像坐标系3.2.3 像素坐标系转换为图像坐标系3.2.4 世界坐标转换为像素坐标 3.3 畸变3.3.1 畸变类型3.3.1.1 径向畸变&#xff08;Radial Distortion&a…

纯粹直播 1.7.7 |手机版和TV版,聚合六大直播平台,原画播放

纯粹直播是一款开源的应用程序&#xff0c;支持兴趣化主题的游戏直播、户外直播和才艺直播节目。目前可以观看斗鱼、B站、虎牙和抖音等六大直播平台的内容。该应用适配了安卓手机和电视盒子平台使用&#xff0c;并且软件无广告&#xff0c;提供原画质播放体验。 大小&#xff…

【论文复现】隐式神经网络实现低光照图像增强

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀ 隐式神经网络实现低光照图像增强 引言那么目前低光照图像增强还面临哪些挑战呢&#xff1f; 挑战1. 不可预测的亮度降低和噪声挑战2.度量友好…

算法第一弹-----双指针

目录 1.移动零 2.复写零 3.快乐数 4.盛水最多的容器 5.有效三角形的个数 6.查找总价值为目标值的两个商品 7.三数之和 8.四数之和 双指针通常是指在解决问题时&#xff0c;同时使用两个指针&#xff08;变量&#xff0c;常用来指向数组、链表等数据结构中的元素位置&am…

JAVA-平台模块系统原理

菜鸟为了巩固所写 目录 菜鸟为了巩固所写 代码之间的依赖性 绘制类型依赖图 扩展到包之间的依赖关系 进一步延伸到jar包之间的依赖性 组件依赖图 JAVA技术领域中的两个著名的“擦除” Java类型的“大泥球” JAVA模块解析 模块解析的过程 模块路径明确模块的搜索与…

Keil5配色方案修改为类似VSCode配色

1. 为什么修改Keil5配色方案 视觉习惯&#xff1a;如果你已经习惯了VSCode的配色方案&#xff0c;尤其是在使用ESP-IDF开发ESP32时&#xff0c;Keil5的默认配色可能会让你感到不习惯。减少视觉疲劳&#xff1a;Keil5的默认背景可能过于明亮&#xff0c;长时间使用可能会导致视…

微服务监控prometheus+Grafana

目录 Prometheus 概述 核心组件 特点 使用场景 Grafana 概述 功能特点 使用场景 PrometheusGrafana组合 部署和配置 一、准备工作 二、部署Prometheus 三、部署Grafana 四、创建监控仪表盘 五、验证和调优 总结 微服务监控是确保微服务架构稳定运行的关键环节…