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

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

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新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)
blank

相关推荐

  • 【JAVA】Java学习路线图「建议收藏」

    【JAVA】Java学习路线图「建议收藏」怎么学习Java,这是很多新手经常会问我的问题,现在我简单描述下一个Java初学者到就业要学到的一些东西:    首先要明白Java体系设计到得三个方面:J2SE,J2EE,J2ME(KJAVA)。J2SE,Java2PlatformStandardEdition,我们经常说到的JDK,就主要指的这个,它是三者的基础,属于桌面级应用开发,这部分如果学得好很容易拓展J2EE和J2ME。

  • zTree实现地市县三级级联Service接口[通俗易懂]

    zTree实现地市县三级级联Service接口

  • 迭代器Python_python进阶路线

    迭代器Python_python进阶路线迭代器迭代是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。可迭代对象我们已经知道可以对l

  • 简单模拟mybatis的MapperScan

    简单模拟mybatis的MapperScan一、问题描述在mybatis中,mapper通常是一个接口,但是我们却可以直接通过这个接口调用方法。按道理来说接口是不能直接调用方法的,只有实现类才能调用接口。但在下面的代码中,我们直接调用applicationContext.getBean(TestMapper.class).list(“”),就可以查询我们的数据库。也就是说applicationContext.getBean(TestMa…

  • sap 获取计划订单bapi_SAP 生产模块常用BAPI「建议收藏」

    sap 获取计划订单bapi_SAP 生产模块常用BAPI「建议收藏」工艺路线BAPI_ROUTING_CREATE创建工艺路线BAPI_ROUTING_EXISTENCE_CHECK检查工艺路线是否存在参考操作集BAPI_REFSETOFOPERATIONS_CREATE创建参考操作集BAPI_REFSETOFOPR_EXISTENCE_CHK检查参考操作集是否存在计划订单BAPI_PLANNEDORDER_CREATE创建计划订单BAPI_PLANNEDORDE…

  • 极客日报第 26 期:华大基因辟谣“基因编辑58个婴儿”;苹果发布头戴式耳机AirPods Max

    极客日报第 26 期:华大基因辟谣“基因编辑58个婴儿”;苹果发布头戴式耳机AirPods Max文章目录互联网快讯程序员专属Github每日精选CSDN社区优质博文精选互联网快讯1、我国一项物联网安全测试技术成为国际标准从WAPI产业联盟获悉,我国自主研发的一项物联网安全测试技术(TRAIS-PTEST)日前由国际标准化组织/国际电工委员会(ISO/IEC)发布成为国际标准。据介绍,该标准是TRAIS-P国际标准的测试标准,它规范了无线射频识别(RFID)安全密码套件一致性测试方法。标准发布后,将从技术到产品测试两个层面共同构成国际标准体系。(新华社)2、百度百科:日均搜索超4亿人次据.

发表回复

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

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