来看线性表的顺序存储的结构代码:

    1. /* 存储空间初始分配量 */
    2. #define MAXSIZE 20
    3. /* ElemType类型根据实际情况而定,这里假设为int */
    4. typedef int ElemType;
    5. typedef struct
    6. {
    7. /* 数组存储数据元素,最大值为MAXSIZE */
    8. ElemType data[MAXSIZE];
    9. /* 线性表当前长度 */
    10. int length;
    11. int size;//元素个数
    12. } SqList;

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

    • 存储空间的起始位置:数组data,它的存储位置就是存储空间的存储位置。
    • 线性表的最大存储容量:数组长度MaxSize
    • 线性表的当前长度:length(元素个数size)

    数组坐标pos=length/size-1

    数组长度与线性表长度区别
    注意哦,这里有两个概念“数组的长度”和“线性表的长度”需要区分一下。

    • 数组的长度是存放线性表的存储空间的长度,存储分配后这个量一般是不变的。有个别同学可能会问,数组的大小一定不可以变吗?我怎么看到有书中谈到可以动态分配的一维数组。是的,一般高级语言,比如C、VB、C++都可以用编程手段实现动态分配数组,不过这会带来性能上的损耗。

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

    在任意时刻,线性表的长度应该小于等于数组的长度。
    地址计算方法
    由于我们数数都是从1开始数的,线性表的定义也不能免俗,起始也是1,
    可C语言中的数组却是从0开始第一个下标的,
    于是线性表的第i个元素是要存储在数组下标为i-1的位置,即数据元素的序号和存放它的数组下标之间存在对应关系(如图所示)。
    image.png
    其实,内存中的地址,都是有编号的。存储器中的每个存储单元都有自己的编号,这个编号称为地址。由于每个数据元素,不管它是整型、实型还是字符型,它都是需要占用一定的存储单元空间的。
    假设占用的是c个存储单元,那么线性表中第i+1个数据元素的存储位置和第i个数据元素的存储位置满足下列关系(LOC表示获得存储位置的函数)。
    LOC(a i+1 )=LOC(a i )+c
    所以对于第i个数据元素a i 的存储位置可以由a 1 推算得出:
    LOC(a i )=LOC(a 1 )+(i-1)*c
    image.png
    通过这个公式,你可以随时算出线性表中任意位置的地址,不管它是第一个还是最后一个,都是相同的时间。那么我们对每个线性表位置的存入或者取出数据,对于计算机来说都是相等的时间,也就是一个常数,
    因此用我们算法中学到的时间复杂度的概念来说,它的存取时间性能为O(1)。
    我们通常把具有这一特点的存储结构称为随机存取结构。