顺序表的定义_顺序表的逻辑顺序和物理顺序

顺序表的定义_顺序表的逻辑顺序和物理顺序顺序表的定义线性表的顺序存储又称为顺序表来看一个生活中的例子:周末和朋友一起吃火锅,人非常多,我们需要在等候区等候,这个等候区就与顺序表有非常多的相似之处,借助它去理解顺序表的特点。首先,在等候

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

顺序表的定义

线性表的顺序存储又称为顺序表

来看一个生活中的例子:周末和朋友一起吃火锅,人非常多,我们需要在等候区等候,这个等候区就与顺序表有非常多的相似之处,借助它去理解顺序表的特点。首先,在等候区有非常多的椅子,这些椅子往往是排成一排连续排放的,中间不会空出很大的空间造成浪费。这就与在顺序表中选取存储单元的方法是一样的,我们会选取一段地址连续的存储单元去存放顺序表。接着工作人员会安排我们在椅子上连续的坐下等候。在存储单元当中去进行数据的存放是一样的,也是依次地存放线性表当中的数据元素,中间也不会空出许多存储单元造成空间的浪费。最后结伴而行的朋友也会坐在相邻的椅子上,这与顺序表的存放是相同的。在逻辑上相邻的两个元素在物理位置上也要保证它相邻,也会把它存放在相邻的存储单元上。在这个例子当中,其实椅子就代表着存储单元,而每一个等候的人就是要存放的数据元素。来总结一下顺序表的特点:

一组地址连续存放的存储单元依次存放线性表的元素,从而使得逻辑上相邻的两个元素在物理位置上也相邻。

所以有这样的规律:顺序表中逻辑顺序与物理顺序相同

顺序表的定义_顺序表的逻辑顺序和物理顺序

其中在逻辑上相邻的两个数据元素,在顺序表中也存放在相同的存储单元当中,每一个小格子就代表一个存储单元。

在程序语言设计中,往往使用数组来实现顺序表。但是数组和顺序表又有一些差别,第一个差别是数组下标是从 0 开始的,而顺序表是从 1 开始的。还有一个就是数组的容量是不可以增加的,而顺序表的容量是可以增加的。还有一些其他的差别,比如说数组可以是多维的,而顺序表是一维的。

顺序表的定义_顺序表的逻辑顺序和物理顺序

根据顺序存储可以知道,它是可以实现随机存取的。这是因为我们可以从第一个元素的地址直接推算出其他元素的地址。在顺序表当中,每一个存放的元素都属于同一种数据对象。那么每一个数据元素,它的大小都是一样的。根据这一特点,我们可以计算出每一个数据元素存储的地址。

顺序表的定义_顺序表的逻辑顺序和物理顺序

第一个元素的地址假设它是 LOC(A) ,计算第二个元素的地址就可以用第一个元素的地址加上第一个数据元素 a1 所消耗的存储空间,用 sizeof 可求得该数据元素所消耗的存储空间大小。这里需要注意的一点是,n 与 MaxSize 是有含义上的不同的,其中 an 代表的是顺序表中最后一个数据元素,而 MaxSize 代表的是数组的最后一个存储单元。

顺序表的两种实现方法

顺序表可以用数组来实现。根据数组的两种分配方式,也就有两种描述顺序表的方法。分别是静态描述分配顺序表的方法和动态描述分配顺序表的方法。首先来看数组静态分配时时如何描述一个顺序表的。

#define MaxSize 50
typedef struct{
    ElemType data[MaxSize];
    int length;
}SqList;

这就是描述顺序表的语句。第一句是定义了一个宏,也就是把 MaxSize 定义为 50,这也就是数组的最大容量。接着定义了一个结构体。结构体就是把多个基本数据类型组合到一起构成一个新的数据类型。它的定义语句是用 typedef struct ,然后用大括号圈起来所要包含的基本数据类型。最后 SqList 代表着该结构体的名字。这个结构体当中有一个存放顺序表的数组,它是 ElemType 类型,其中数组大小是 MaxSize,也就是 50,还有一个整型的 length,它是代表顺序表的长度。这就是一个顺序表的程序设计语言描述。

接下来看数组动态分配是如何描述顺序表的。

#define MaxSize 50
typedef struct{
    ElemType *data;
    int length;
}SqList;

这是动态分配时描述顺序表的语句,观察发现这里用的是指针,指针是存放一个存储单元地址的。顺序表根据第一个数据元素的地址和数据元素的大小,就可以计算出任意数据元素的位置。那么只要定义了第一个数据元素的指针,就可以描述整个顺序表。但是这一个变量它仅仅是一个地址,而没有确切的空间,所以在使用时,需要动态的申请空间。怎样动态的申请空间呢?有这样两条语句:

C		L.data = (Elemtype*)malloc(sizeof(ElemType)*InitSize);
C++		L.data = new ElemType[InitSize];

L 是 SqList 类型的一个变量,也就是 L 代表这一个顺序表,接着用 malloc 这个动态函数来申请空间,函数参数部分是申请空间的大小,是用 sizeof 计算每一个数据类型的大小乘以它的个数,就计算出整个需要申请空间的大小,malloc 前面的括号部分可以理解为强调了申请空间的类型。这是 C 语言中的方法。C++ 中直接 new 一个申请空间的类型和大小。

在使用动态分配时,一定要先申请空间才能使用,因为如果没有申请空间,它仅仅是一块地址,而没用所需要的空间。

静态分配和动态分配有什么不同呢?其实也就是数组的不同。在静态分配时,我们在编写的时候,就已经确定了数组的大小。而动态分配时,没有确定它的大小,是根据动态分配语句在运行时才将它的大小进行分配。这样有一点的好处就是,在静态分配时,当我想要存放顺序表的数据元素过超过 50 的时候则会产生错误溢出,而动态分配时,如果一旦超过了分配的空间大小,可以再重新分配一块内存空间,把旧的空间和所增加的数据元素转移到新申请的空间上,这样就不会产生溢出的问题了。这是动态分配的一个优点。

记住,动态分配依旧是一块连续的存储空间,绝非是链式存储。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/167953.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • springboot讲解(终章怎么解释)

    转载请标明出处:https://blog.csdn.net/forezp/article/details/70341818本文出自方志朋的博客SpringBoot非官方教程|终章:文章汇总springboot非官方教程,可能最接近于官方的一个教程,大多数案例都来自于官方文档,为了更好的理解,加入了个人的改造。码云下载:https://git.oschina…

  • 比特每秒bps,2Mbps=256kbit下载速度转换算法。

    比特每秒bps,2Mbps=256kbit下载速度转换算法。

  • Kafka集群常用命令行操作[通俗易懂]

    Kafka集群常用命令行操作[通俗易懂]Kafka集群常用命令行操作1、创建topic创建一个名字为test的主题,有三个分区,有两个副本node01执行以下命令来创建topiccd/export/servers/kafka_2.11-1.0.0bin/kafka-topics.sh–create–zookeepernode01:2181–replication-factor2–partitions…

  • GDI 总结三: CImage类使用「建议收藏」

    GDI 总结三: CImage类使用「建议收藏」若对您有所启发欢迎打赏古典小说网致力于打造极致阅读体验首创卡拉OK读书方式首创,桌面大屏幕TXT阅读方式前言CImage类是基于GDI+的,但是这里为什么要讲归于GDI?主要是基于这样的考虑:在GDI+环境中,我们可以直接使用GDI+,没多少必要再使用CImage类…

  • 3D建模场景怎么做?

    3D建模场景怎么做?在开始做3d场景之前,我绘制了一些草图。选好需要的草图后(图01),我用3dsmax从标准几何体开始制作模型,还使用了像lathe,bevel以及unwrapuvw这类的基本修改器。用不同的参数值进行复制(图02)。为了完成这个项目,一些额外的模型也是必须的(图03)。图01图02图03开始制作材质也就意味着有趣的一部分工作开始了。我喜欢用unwrap修改器工作,然后将所有的展开的渲染图全部输入到photoshop软件中,在photoshop中我可以根据…

  • phpstrom2021激活码 3月最新注册码

    phpstrom2021激活码 3月最新注册码,https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号