顺序表的定义

顺序表的定义

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

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

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

因此有这样的规律:顺序表中逻辑顺序与物理顺序相同3d

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

在程序语言设计中,每每使用数组来实现顺序表。可是数组和顺序表又有一些差异,第一个差异是数组下标是从 0 开始的,而顺序表是从 1 开始的。还有一个就是数组的容量是不能够增长的,而顺序表的容量是能够增长的。还有一些其余的差异,好比说数组能够是多维的,而顺序表是一维的。code

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

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

顺序表的两种实现方法

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

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

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

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

#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 的时候则会产生错误溢出,而动态分配时,若是一旦超过了分配的空间大小,能够再从新分配一块内存空间,把旧的空间和所增长的数据元素转移到新申请的空间上,这样就不会产生溢出的问题了。这是动态分配的一个优势。

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

相关文章
相关标签/搜索