• 第三章:线性表


    一、线性表

    二、顺序存储结构

    三、链式存储结构

    1.单链表

    2.静态链表

    3.循环链表

    4.双向链表


     一、线性表 

    1.线性表(List):零个或多个数据元素的有限序列。
    2.分类

     3.线性表的抽象数据类型

    对于一个线性表来说,插入或者删除数据都是必须的操作,因此线性表的抽象数据类型定义如下:

    ADT线性表(List)
    Data
    线性表的数据对象集合为 (a1, a2, a3, ……, an), 每个元素的类型均为 DataType。其中,除第一个元素外,每个元素有且只有一个直接前驱元素;除了最后一个元素外,每个元素有且只有一个直接后继元素。数据元素之间的关系是一对一的关系。
    Operation
    InitList (*L) : 初始化操作,建立一个空的线性表L。
    ListEmpty (L): 若线性表为空,返回 true,否则返回 false。
    ClearList (*L): 将线性表清空。
    GetElem (L, i, *e): 将线性表 L 中的第 i 个元素值返回给 e。
    LocateElem (L, e): 在线性表 L 中查找与给定值 e 相等的元素,如果查找成功,返回该元素在表中序号表示成功;否则,返回 0 表示失败。
    ListInsert (*L, i, e):  在线性表 L 中的第 i 个位置插入新元素 e。
    ListDelete (*L, i, *e): 删除线性表 L 中第 i 个位置元素,并用 e 返回其值。
    ListLength (L): 返回线性表 L 的元素个数。
    
    endADT

    二、顺序存储结构

    1.线性表的顺序存储结构:指的是用一段地址连续的存储单元依次存储线性表的数据元素。
    线性表(a_1,a_2,·····,a_n)的顺序存储示意图如下所示:

           线性表的顺序存储结构,就是在内存中找了块地儿,通过占位的形式,把一定内存空间给占了,然后把相同数据类型的数据元素依次存放在这块空地中。既然线性表的每个数据元素的类型都相同,所以可以用 C 语言(其它语言也相同)的一维数组来实现顺序存储结构,即把第一个数据元素存到数组下标为 0 的位置中,接着把线性表相邻的元素存储在数组中相邻的位置。
    • 线性表顺序存储的结构代码:
    /* 存储空间初始分配量 */
    #define MAXSIZE 20 
    
    /* ElemType 类型根据实际情况而定,这里假设为 int */
    typedef int ElemType;
    
    typedef struct {
        /* 数组存储数据元素,最大值为 MAXSIZE */
        ElemType data [MAXSIZE];
        /* 线性表当前长度 */
        int length;
    }SqList;

     2.存储器中的每个存储单元都有自己的编号,这个编号称为地址。每个数据元素,不管它是整型,实型还是字符型,它都是需要占用一定的存储单元空间的,假设占用的是 c 个存储单元,那么对于线性表的第 i 个数据元素 a_i 的存储位置都可以由 a_1 推导算出:

    LOC(a_i) = LOC(a_1) + (i-1)*c

    上述推导公式具体内容如下图所示:

    通过该公式,就可以随时算出线性表中任意位置的地址,不管是第一个还是最后一个,都是相同的时间。也即对于线性表每个位置的存入或者取出数据,对于计算机来说都是相等的时间,也就是一个常数时间,因此,线性表的存取操作时间性能为 O(1)。我们通常将存取操作具备常数性能(O(1))的存储结构称为 随机存储结构。4.线性表的顺序存储结构,对于存取操作,其时间复杂度为 O(1)(因为元素位置可以直接计算得到);对于插入和删除操作,其时间复杂度为O(n)(因为插入或删除后,需要移动其余元素)。因此,线性表顺序存储结构比较适用于元素存取操作较多,增删操作较少的场景。

    3.顺序存储结构的插入与删除

    3.1.插入操作

     3.2.删除操作

    4.线性表顺序存储结构的优缺点 

    三、链式存储结构

    线性链表在插入和删除数据的时候需要移动大量的元素,那么有什么办法解决这个问题呢?

    1.单链表

    1.1.结构

     最后一个节点:

    头节点:

    1.2.存储结构

    1.3.单链表的读取

    1.4.单链表的插入与删除

    插入:

    删除:

     

     1.5.单链表整表的创建与删除

    创建:

    删除:

     1.6.单链表结构与顺序储存结构的优缺点

     
     

    2.静态链表

    3.循环链表

     

    4.双向链表

     
     
  • 相关阅读:
    二维RMQ问题
    乘法逆元的一些求法
    对于一些小的数学的方法的一些记录
    第一次举办比赛记
    牛客网比赛-Wannafly挑战赛27
    [HEOI2012]Akai的数学作业-题解
    线性基简单学习笔记
    1978 Fibonacci数列 3
    1076 排序
    1205 单词翻转
  • 原文地址:https://www.cnblogs.com/aaaazzzz/p/12811615.html
Copyright © 2020-2023  润新知