当前位置:   article > 正文

【数据结构(6)】2.4 线性表的顺序表示和实现_空的顺序表 示意图

空的顺序表 示意图

在计算机内,线性表分为顺序存储结构链式存储结构

1. 线性表的顺序存储表示

  • 线性表的顺序表示有称为顺序存储结构顺序映像

顺序存储定义

  • 把逻辑上相邻的数据元素存储在物理上相邻的存储单元中的存储结构。

  • 逻辑上相邻的元素,在物理位置上也相邻

在这里插入图片描述

  • 线性表的第一个数据元素 a1 的存储位置,称为线性表的起始位置基地址

顺序存储结构

例如:线性表(1,2,3,4,5)的存储结构:

在这里插入图片描述

顺序表中元素存储位置的计算

知道某个元素在什么位置,以及元素的数据类型,那么下一个元素在什么位置就很容易算出来了。

在这里插入图片描述

  • 如果每个元素占用 8 个存储单元 ,ai 存储位置是 2000 单元,那么 ai+1 的存储位置就是 2008单元。
  • 假设线性表的每个元素占 t 个存储单元,则第 i + 1 个数据元素的存储位置和第 i 个数据元素的存储位置之间满足关系:
    • LOC(ai+1) = LOC(ai) + t
  • 由此,所有数据元素的存储位置均可由第一个数据元素的存储位置得到:
    • LOC(ai) = LOC(a₁) + (i - 1) x t

线性表的特点

  • 以物理位置相邻表示逻辑关系。
  • 任一元素均可随机存取(优点)。

顺序表的存储结构类型定义

在这里插入图片描述

如何让线性表可长可短?

  • 额外找一个变量来表示线性表的长度。

线性表的类型定义模板

  • 用这个就可以修改成各种顺序存储结构的类型定义
#define LIST_INIT_SIZE 100 //线性表存储空间的初始分配量

typedef struct
{
        int ElemType elem[LIST_INIT_SIZE];
        int length;//当前长度,存储线性表中元素的个数

}SqList;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

多项式的顺序存储结构类型定义

在这里插入图片描述

  • 多项式只存储非 0 项的系数和指数,每一项都要存储系数和指数两个信息。
#define MAXSIZE 100 //多项式可能达到的最大长度

typedef struct //多项式非0项的定义
{
        float p;//存储非0项的多项式的系数
        int   e;//存储非0项的多项式的指数
}polynomial;

typedef struct
{
        Polynomial* elem ;//存储空间的首元素地址
        int length;//多项是中当前项的个数

}SqList;//多项式的顺序存储结构类型为SqList
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

图书表的顺序存储结构类型定义

在这里插入图片描述

#define MAXSIZE 100 //图书表可能达到的最大长度

typedef struct //图书信息定义
{
        char  no[20]  ;//图书ISBN
        char  name[50];//图书名
        float price   ;//图书价格
}BOOK;

typedef struct
{
        BOOK* elem ;//存储空间的首元素地址
        int length;//图书表中当前图书的个数

}SqList;//图书表的顺序存储结构类型为SqList
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

顺序表示意图

在这里插入图片描述

  • 就像 int a一样,用 int 来定义a,a 是 int 类型的。
  • SqList是自定义的顺序表类型,SqList L就能将 L 定义成一个顺序表。
typedef struct
{
        ElemType* elem ;
        int length;

}SqList;//定义的顺序表类型为SqList

int main()
{
        SqList L= {0};//定义并初始化一个SqList类型的的顺序表L。
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

在这里插入图片描述

对顺序表 L 内的成员进行引用及操作【自定义数据类型】,说白了就是对结构体的操作。

2. 顺序表的基本操作的实现

  • 补充:操作算法中用到的预定义常量和类型

在这里插入图片描述

线性表初始化

  • 顺序表的初始化操作就是构造一个空的顺序表

在这里插入图片描述

销毁线性表L

  • 将占用的空间释放回内存

在这里插入图片描述

清空线性表L

  • 将线性表内的东西清除。

在这里插入图片描述

求线性表L的长度

  • 知道线性表中到底有几个元素。

在这里插入图片描述

判断线性表L是否为空

  • 判断 L 的 length 成员是不是0,为0则说明线性表内没有元素。

在这里插入图片描述

顺序表的取值

  • 根据位置 i 获取相应位置数据元素的内容。
  • 所有的语句都只执行一次,所以这段代码的时间复杂度为O(1)。

在这里插入图片描述

顺序表的查找

  • 在线性表 L 中查找与给定值 e 相等的元素,若成功,则返回该元素在表中的序号,反之返回 0。
    按值查找
  • 例如:在图书表中,按照给定书号进行查找,确定是否存在该图书。
    • 如果存在:输出是第几个元素,如果不存在,输出0。

顺序查找法

  • 在线性表 L 中查找与指定值 e 形同的数据元素的位置。

  • 从表的一端开始,逐个进行记录的关键字和给定值的比较。找到,返回该元素的位置序号,未找到,返回0。

  • for循环实现顺序查找:

在这里插入图片描述

  • while循环实现顺序查找:

在这里插入图片描述

算法分析

  • 查找算法的基本操作为:将记录的关键字同给定值进行比较。
    • 基本操作:L.elem[i] = e

在这里插入图片描述

平均查找长度 ASLAverage Search Length)

  • 为确定记录在表中的位置,需要与给定值进行比较的关键字的个数的期望值叫做查找算法的平均查找长度

在这里插入图片描述

  • pi 第 i 个记录被查找的概率;
  • ci 找到第 i 个记录需比较的次数。

在这里插入图片描述

假设要查找前7个元素的数,则用前7个位置数相加再除掉比较的元素个数。在这里插入图片描述

  • 假设每个记录的查找概率相等,则平均查找长度为 (n+1) / 2

顺序表的插入

  • 在线性表 L 中第 i 个位置插入新元素 e。

  • 线性表的插入操作是指在表的第 i 个位置插入一个新的数据元素 e ,使长度为 n 的线性表变成长度为 n + 1的线性表。

  • 现有一个长度为6个元素的顺序表。

在这里插入图片描述

插入算法演示

  • 插入位置在最后:
    • 直接将下标为 6 的元素赋值就行了

在这里插入图片描述

  • 插入位置在中间
    • 假设插入到下标为 4 的位置上去,先将 f 移动到下标为6的位置,然后将a移动到下标为 5 的位置,这样就能在原来a所在的位置插入元素了。
    • 依次将后面的元素后移一位,才能插入进去。

在这里插入图片描述

  • 插入位置在最前
    • 将所有的元素依次往后移,然后将元素插入到 0 号位置。

在这里插入图片描述

算法思想

  1. 判断插入位置 i 是否合法(i 的合法范围是 1<= i <= n+1),若不合法则返回ERROR。
  2. 判断顺序表的存储及空间是否已满,若满则返回ERROR。
  3. 将第 n 个至第 i 个位置的元素依次向后移动一个位置,空出第 i 个位置(i = n+1时无需移动)。
  4. 将要插入的新元素 e 放入第 i 个位置。
  5. 表长加1,插入成功返回 OK。

算法描述

在这里插入图片描述

算法分析

算法时间主要耗费在移动元素的操作上

  • 若插入在尾结点之后,则根本无需移动(特别快)。
  • 若插入在首结点之前,则表中元素全部后移(特别慢)。
  • 若要考虑在各种位置插入(共 n+1 种可能)的平均移动次数,该如何计算?

在这里插入图片描述

  • 顺序表插入算法的平均时间复杂度O(n)

顺序表的删除

  • 删除线性表 L 中第 i 个位置元素,用 e 返回。
    -删除元素之后,其余元素的前驱和后继的关系不能改变。

在这里插入图片描述

删除算法演示

  • 删除位置在最后
    • 直降将最后一个元素删除,其余元素不用移动。
    • 表中元素个数 - 1。

在这里插入图片描述
在这里插入图片描述

  • 删除位置在中间
    • 将被删除的元素后面的元素依次往前挪。

在这里插入图片描述
在这里插入图片描述

  • 删除位置在最前
    • 将后面所有的所有元素依次往前移。

在这里插入图片描述
在这里插入图片描述

算法步骤

  1. 判断删除位置 i 是否合法(合法值为1 <= i <= n),若不合法则返回ERROR。
  2. 将第 i + 1 个至第 n 个的元素依次往前移动一个位置(i 是最后一个元素时无需移动)。
  3. 表长减1,删除成功则返回OK。

算法描述

在这里插入图片描述

算法分析

算法时间主要耗费在移动元素的操作上。

  • 若删除尾结点,则根本无需移动(特别快)。
  • 若删除首结点,则表中 n - 1个元素全部前移(特别慢)。
  • 若要考虑在各种位置删除(共 n 种可能)的平均移动次数,该如何计算?

在这里插入图片描述

  • 顺序表删除算法的平均时间复杂度为 O(n)

3. 顺序表小结

顺序表特点

  • 利用数据元素的存储位置表示线性表中相邻的数据元素之间的前后关系,即线性表的逻辑结构与存储结构一致
  • 在访问线性表时,可以快速的计算出任何一个数据元素的存储地址。因此可以粗略的认为,访问每个元素所花时间相等。
  • 这种存取元素的方法被称为随机存取法

顺序表的算法分析

  • 时间复杂度
    • 查找、插入、删除算法的平均时间复杂度为 O(n)
  • 空间复杂度
    • 显然,顺序表操作算法的空间复杂度 S(n) = O(1)(没有占用辅助空间)。

顺序表优缺点

  • 优点
    • 存储密度大(结点本身所占存储量 / 结点结构所占存储量)。
    • 可以随机存取表中任一元素。
  • 缺点:为了克服缺点 ——> 链表
    • 在插入、删除某一元素时,需要移动大量元素。
    • 浪费存储空间。
    • 属于静态存储形式,数据元素的个数不能自由扩充。
声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号