【数据结构】线性表的顺序存储结构

news2024/11/7 11:24:29

🦄个人主页:修修修也

🎏所属专栏:数据结构

⚙️操作环境:Visual Studio 2022


 一.顺序存储定义

上篇文章中介绍了线性表一共分为两种数据结构——顺序存储结构链式存储结构.

今天我们就来一起学习一下第一种——顺序存储结构.

线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素.

线性表(a1,a2,......,an)顺序存储示意图如下:

顺序存储结构有些像什么呢,举个例子吧.

记得大一的时候有个物理老师给我们带大学物理,第一节课刚去的时候,大家都零零散散的坐着,有的想好好听讲的就坐在前三排,有些想摸鱼划水的就坐在后两排,没抢到前面三排也没抢到后面两排的同学就只好委屈坐在了中间几排.

这时候老师进来了,一看我们坐的零零散散的样子,非常不满意,说:"我们这节课一共有80个同学,我们的教室刚好一排可以坐10个人,现在所有前8排后面的同学都向前移,直到将教室前8排的位置坐满."

我们就只好像沙丁鱼罐头一样全部向前8排的位置挪动,一个紧挨着一个坐着,最后终于全部同学都坐到前8排了,老师才不仅不慢的说:"我这个人嗓门比较小,加上教室的扩音器不太好,如果你们坐在后面讲课的声音传到你们的耳朵就大打折扣了,所以为了能更高效的上课,以后都委屈大家就像今天这样坐了."

后来每次上这个老师的课我们都像第一次那样全部坐在前8排,即便偶尔有请假的同学老师也不允许前面的位置空着,只允许从最后一排的最右边那个位置开始空.

这样上课冬天还好,夏天真是挺煎熬的,有时候大家一个挨着一个很热就不说了,主要是有时会有一些让人"难忘的销魂味道".那滋味,真是不堪回首啊.


二.顺序存储方式

线性表的顺序存储结构,说白了,和刚才的例子一样,就是在内存中找了块地儿,把一块内存空间给占用了,然后把相同的数据类型的数据元素依次存放在这块空地中.

既然线性表的每个数据元素的类型都相同,所以可以用C语言的一维数组来实现顺序存储结构,即把第一个元素存到数组下标为0的位置中,接着把线性表相邻的元素存储在数组中相邻的位置.

为了建立一个线性表,要在内存中找一块地,于是这块地的第一个位置就非常关键,它是存储空间的起始位置.

接着,我们需要先大概根据数组的长度设置一个存储容量.

有了起始位置,有了存储容量,于是我们就可以在里面增加数据了.随着数据的插入,我们线性表的长度开始变大,当线性表的长度超过存储容量时,我们就需要给顺序表扩容.

这时,我们发现描述顺序存储结构需要三个属性:

  • 存储空间的起始位置:数组arr,它的存储位置就是存储空间的存储位置.
  • 线性表的最大存储容量:数组长度capacity.
  • 线性表的当前长度:size.

三.数组长度与线性表长度的区别

数组的长度(capacity)是存放线性表的存储空间的长度,存储分配后这个量一般是不变的.

线性表的长度是线性表中当前数据元素的个数,随着线性表插入和删除操作的进行,这个量是变化的.

从这张图上也可以看出数组长度capacity包含了当前数据占用的空间及空闲的空间,但线性表长度size只计算当前的数据占用的空间.

注意:在任意时刻,线性表的长度应该小于等于数组的长度.


四.地址计算方法

C语言中的数组是从0开始第一个下标的,因此线性表的第i个元素要存储在数组下标为i-1的位置,即数据元素的序号和存放它的数组下标之间存在对应关系:

用数组存储顺序表意味着要分配固定长度的数组空间,由于线性表中可以进行插入和删除操作,因此分配的数组空间要大于等于当前线性表的长度.


内存中的地址,就和图书馆或电影院里的座位一样,都是有编号的.

存储器中的每个存储单元都有自己的编号,这个编号称为地址.

告诉大家一个秘密,大学女生宿舍一般上课时几个人都是坐在一起的,即宿舍的第一个成员位置确定后,后面其他的舍友的位置都是可以计算的.

再比如学校每学年都会进行的体测800米,舍友小A是班上第5名,我是她后面10名,那我肯定是第15名,因为5+10=15.

由于每个数据元素,不管是整型,浮点型还是字符型,它都是需要占用一定的存储单元空间的.

想进一步了解数据在内存中的存储的可以移步这篇博客:整型数据和浮点型数据在内存中的存储

我们假设一个数据元素占用的是n个存储单元,那么线性表中第i+1个数据元素的存储位置和第i个数据元素的存储位置满足下列关系(LOC表示获得存储位置的函数):

LOC(a_{i+1})=LOC(a_{i})+n

所以对于第i个数据元素a_{i}的存储位置可以由a1推算得出:

LOC(a_{i})=LOC(a_{1})+(i-1)*c

拿上面的图来说就是:

通过这个公式,我们可以随时算出线性表中任意位置的地址,不管它是第一个还是最后一个,都是相同的时间.

因此我们对每个线性表位置的存入或者取出数据,对于计算机来说都是相等的时间,也就是一个常数,因此用我们算法篇中学到的时间复杂度的概念来说,它的存取时间复杂度为O(1).

我们通常把具有这一特点的存储结构称为随机存取结构.

tips:随机存取结构(Random Access Structure)是一种数据结构,它允许通过直接访问数据的任意位置来读取或写入数据.

与顺序存取结构不同,顺序存取结构只能按照数据的顺序进行访问需要逐个遍历数据才能找到目标位置.


随机存取结构通常使用数组来实现。数组是一种连续存储数据的结构可以通过索引来直接访问数组中的任意元素

顺序存取结构通常使用链表来实现.链表是一种非连续存储数据的结构每个元素包含一个指针,指向下一个元素的位置,可以通过遍历链表来访问指定位置的元素


随机存取结构的优点是可以快速访问和修改数据时间复杂度为O(1),即常数时间。

缺点插入和删除操作可能需要移动其他元素的位置时间复杂度为O(n),其中n是数据的数量。

因此,在需要频繁插入和删除操作的场景中,随机存取结构可能不是最优选择。


五.顺序表的C语言实现

当我们搞明白了线性表的顺序存储结构的理论知识后,接下来就需要依据这些理论知识来使用C语言实现顺序表了,由于篇幅有限,我会另外再写一篇博客详细阐释用C语言实现顺序表的各个步骤以及顺序表的完整代码和运行效果都会包含在里面,感兴趣的朋友可以直接点击下方链接跳转到博客:

【数据结构】顺序表的C语言实现详解(附完整运行代码)icon-default.png?t=N7T8https://blog.csdn.net/weixin_72357342/article/details/133817272


 结语

当我们搞清楚线性表的顺序存储结构后,在数据结构线性表篇我们还将一起学习线性表的链式存储结构(链表的实现)等相关知识.希望这些内容能对大家有所帮助,一起学习,一起进步!

相关文章推荐

【数据结构】什么是数据结构?

【数据结构】什么是算法?

【数据结构】什么是线性表?

【数据结构】线性表的抽象数据类型

【数据结构】线性表的链式存储结构(链表的实现)

【C语言】整形数据和浮点型数据在内存中的存储

【C语言】结构体的大小是如何计算的?(结构体对齐)



数据结构线性表篇思维导图:

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

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

相关文章

AUTOSAR AP硬核知识点梳理(1)

一 什么是 Adaptive AUTOSAR? Adaptive AUTOSAR是一种新的汽车软件框架,旨在满足现代汽车行业中不断增长的技术需求。随着汽车变得越来越智能,对处理器的性能要求也在不断增长。 Adaptive AUTOSAR旨在通过提供高性能计算和通信机制以及灵活的软件配置来满足这些需求,为车…

代码随想录算法训练营第五十三天 | 309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费

309.最佳买卖股票时机含冷冻期 视频讲解: https://programmercarl.com/0309.%E6%9C%80%E4%BD%B3%E4%B9%B0%E5%8D%96%E8%82%A1%E7%A5%A8%E6%97%B6%E6%9C%BA%E5%90%AB%E5%86%B7%E5%86%BB%E6%9C%9F.html (1)代码 714.买卖股票的最佳时机含手续费…

通过字符设备驱动并编写应用程序控制三盏灯亮灭

现象 键盘按1三灯全亮 按0三灯全灭 头文件.h #ifndef __HEAD_H__ #define __HEAD_H__ #define PHY_LED1_MODER 0X50006000 #define PHY_LED1_ODR 0X50006014 #define PHY_RCC 0X50000A28#define PHY_LED2_MODER 0X50007000 #define PHY_LED2_ODR 0X50007014#defin…

底层驱动day2作业

控制三盏灯亮灭 代码: //head.h#ifndef __HEAD_H__ #define __HEAD_H__ #define PHY_RCC 0x50000A28 #define PHY_GPIOE_MODER 0x50006000 #define PHY_GPIOF_MODER 0x50007000 #define PHY_GPIOE_ODR 0x50006014 #define PHY_GPIOF_ODR 0x50007014#endif //demo…

JAVA毕业设计100—基于Java+Springboot+Vue的WMS仓库管理系统+移动端微信小程序(源码+数据库+部署视频)

基于JavaSpringbootVue的WMS仓库管理系统移动端(源码数据库部署视频) 一、系统介绍 本系统前后端分离带小程序 本系统分为管理员、用户角色(角色权限可自行分配) 功能列表: 1、 数据管理:物料数据管理、物料Bom管理、物料组管理、物料分类管理、供应…

口袋参谋:如何提升宝贝的点击率?这两种方法超简单!

​如何提升宝贝的点击率?这是99.99%商家都在疑惑的问题。今天我说的两种方法,超简单,一起来看看吧! 1、找精准关键词 首先一定要选择适合自己店铺的关键词,一定要精准。 找关键词的方法如下: a.卖家可以…

Coreldraw2020最新64位电脑完整版本下载教程

安装之前所有的杀毒软件都要退出。无论是360,腾讯管家,或者电脑自带的安全中心,要不然会阻止安装。 CorelDRAW2020版win下载如下:https://wm.makeding.com/iclk/?zoneid55678 CorelDRAW2020版mac下载如下:https://wm.makeding.com/iclk/?…

2023年全球及中国溶瘤病毒治疗药物行业现状及发展趋势分析[图]

溶瘤病毒治疗肿瘤具有杀伤效率高、靶向性好、安全性高、不良反应小等特点,溶瘤病毒疗法已经成为肿瘤治疗研究领域的新热点。溶瘤病毒疗法经历了早期对于天然病毒的摸索,后期基因工程技术的进步提升OV靶向性及免疫致敏能力,推动其快速发展。 …

性能测试 —— 数据准备与基准场景设计!

基础性能脚本 延迟时间网络时间服务处理时间 主要使用监听器,通过两者的差值,判断响应时间消耗: jpgc - Connect Times Over Timejpgc - Response Times Over Time 调试脚本阶段,可以使用查看结果树等监听器来观察运行结果 正…

经典网络模型

Alexnet VGG VGG的启示 VGGNet采用了多次堆叠3x3的卷积核,这样做的目的是减少参数的数量。 例如,2个3x3的卷积核效果相当于1个5x5的卷积核效果,因为它们的感受野(输入图像上映射区域的大小)相同。但2个3x3卷积核的参数…

使用SpringCloudalibaba+Vue开发仿社交小程序全套视频课程

使用SpringCloudalibabaVue开发仿社交小程序全套视频课程 学习此课程你将会学到: 1. 熟练掌握小程序开发与部署2. 学会前后端分离开发与联调3. 从0到1学会微服务架构与落地4. 掌握主流中间件的封装与设计5. 掌握复杂数据库分库分表6. 收获一个商业级的面试作品 适…

MyBatisPlus实现连表操作、批量处理

1、实现连表查询 正常来说单靠mybatisplus无法实现连表查询,只能靠单表sql然后进行拼接形成连表查询,或者使用xml文件去编写sql语句来实现连表查询。但他又给我们提供了一个插件MyBatis-Plus-Join,用来弥补mybatisplus再连表上的不足&#…

中间件安全-CVE复现IISApacheTomcatNginx漏洞复现

目录 中间件安全&CVE复现&IIS&Apache&Tomcat&Nginx漏洞复现中间件-IIS安全问题中间件-Nginx安全问题漏洞复现Nginx 解析漏洞复现Nginx 文件名逻辑漏洞 中间件-Apache-RCE&目录遍历&文件解析等安全问题漏洞复现漏洞复现CVE_2021_42013 RCE代码执行&…

LeetCode-496 下一个更大元素

一、前言 今天想要分享的题目其实和之前写的股票价格那道题所用到的结构是一样的,就是单调栈,因为自己当时也对这种结构不太熟悉,看到评论区很多大佬说如果遇到要找下一个最大/最小这一类的题目,可以往单调栈这一块儿去想&#x…

CAD Exchanger SDK 3.22.0 Crack

Docker 映像、Autodesk Inventor 2022 支持以及从 CAD Exchanger 3.22.0 中的 CATIA 导入属性 使用 Docker 映像将您的软件运送到任何地方,独立于 Autodesk 软件读取 .ipt、.iam 文件,从 CATIA 探索机械、产品和自定义属性。 软件开发工具包产品更新发明…

暄桐四阶课程「自在行草」学习装备指南

在2011年,暄桐成立的最初,课程便是面向零基础的成年人设计的。在十余年的教学实践中,暄桐教室为同学们提供了一种系统、有趣、扎实,并可持续进阶的学习可能。许多同学都是在来到暄桐以后,才第一次拿起毛笔,…

138.【JUC并发编程- 03】

JUC并发编程- 03 (六)、共享模型之无锁1.问题提出(1).为什么不安全?(2).安全实现_使用锁(3).安全实现_使用CAS 2.CAS与volatile(1).CAS_原理介绍(2).CAS_Debug分析(3).volatile(4).为什么无锁效率高(5).CAS的特点 3.原子整形(1).原子整数类型_ 自增自减(2).原子整数类型_乘除模…

【建立单链表:头插法,尾插法;循环列表,带尾指针的循环链表合并(将Tb合并在Ta之后)】

文章目录 一、单链表的基本操作的实现1.建立单链表:头插法----元素插入在链表头部,也叫头插法。2.建立单链表:尾插法----元素插入在链表尾部,也叫尾插法。 二、线性表的链式表示和实现1.循环列表2.带尾指针的循环链表合并&#xf…

用自定义的QSortFilterProxyModel实现条件过滤,使qtableview中只显示满足条件的行信息

在实际开发中,qtableview是qt客户端页面中最常用的控件之一。运用qtableview的同时,也会存在着先对初始数据进行过滤,然后在qtableview上展示的只有满足条件的那些信息。或者在不同的条件下要展示出不同的满足条件的行信息。 第一种方法&…

电脑删除的视频怎么恢复?可尝试着3钟恢复办法!

无论是为了工作还是生活,我们都有可能在电脑上保存重要的视频,如宣传视频、回忆录视频等。这些视频通常包含了制作者的心血,要是被我们误删除了,很难重新拍摄,那么电脑删除的视频怎么恢复? 能。通常&#…