9-线性表的顺序存储结构

1. 线性表的顺序存储

  线性表可以采用顺序存储也可以采用连式存储的方式,对于线性表的顺序存储结构指的是把线性表中的所有元素按照其逻辑顺序依次存储到从计算机存储器中指定的存储位置开始的一块连续的存储空间中。

  这块连续的存储空间我们可以认为是一个数组,线性表 (a1,a2,……,an)的顺序存储示意图如下:

9-线性表的顺序存储结构_第1张图片
图1-线性表的顺序存储

  当线性表中的数据存储到数组中,第一个元素在数组中的索引位置是从0开始的,也就是说,数组索引为0的位置保存着线性表的第一个数据元素 a1 a 1 ,索引为n-1的位置保存着线性表的第n个数据元素 an a n

  在这个数组中还预留了一些空间,以存储线性表中新添加的数据元素,也就是说我们在定义数组大小的时候通常都会定义成MaxSize大小,其中数组的有效长度指的是数组中存储的有效元素的个数,即数组索引0 - n的位置就是数组的有效长度,我们可以知道线性表的长度就为n,且线性表所占用的存储空间就是n * sizeof(ElemType)大小,ElemType是数据元素的类型标识符。

  在这里我们总结一下顺序表和线性表的区别,主要区别在于:线性表是基于逻辑结构的,而顺序表是基于存储结构的。

2. 顺序表存储类型

  了解了顺序表的存储结构后,我们再来看一下顺序表的存储结构在计算机中是如何定义和存储的。在C语言中顺序表的定义如下:

#define MaxSize 50
typedef struct
{
    ElemType data[MaxSize];  //定义数组,数组大小为MaxSize
    int length;  //数组的有效长度
} SqList;



顺序表的存储结构如下:

9-线性表的顺序存储结构_第2张图片
图2-顺序表的存储结构

  通过数组的下标位置可以确定数组的存储空间,即通过下标0可以访问 a1 a 1 元素,同时我们还可以通过数组名+下标就可以计算出实际的存储地址。那么我们可以通过数组首元素的起始地址LOC(A) + sizeof(ElemType)计算出下一个元素的存储地址,其他元素以此类推。从顺序表的存储空间来看,n存储着数组的有效长度。

3. 示例—城市表的顺序存储

我们来看一下城市表中的数据,如下所示:

9-线性表的顺序存储结构_第3张图片
图3-城市表

  城市表中,每一条城市记录都包括了区号,城市名,说明这几个信息。如果,我们要用顺序表去存储这样的数据应该是怎么去做呢?

我们来看一下城市表的顺序存储:

#define MaxSize 50
//城市记录
typedef struct city
{
    char code[4];       //区号
    char name[10];      //城市
    char describe[16];  //说明
} ElemType;

typedef struct
{
    ElemType data[MaxSize]; //data数组用于存储顺序表的数据元素
    int length;  //数组的有效长度
} SqList;

  结合图2来看,我们可以通过C语言中的struct结构体来自定义数据类型以实现顺序表的存储, 在SqList这样的结构体中定义了data这样的数组来保存城市记录这样的数据, MaxSize为数组的大小, 而length则表示数组有效长度, ElemType表示数组中存储的数据元素的类型,也就是用ElemType结构体来存储每条城市记录, 包括了区号,城市名,说明。

  当顺序表的存储结构已经定义完毕后,下一步就是如何设计顺序表的基本运算了。

你可能感兴趣的:(数据结构基础)