04-线性表的顺序表示

37 阅读2分钟

定义

  • 定义:用顺序存储的方式实现线性表

    image.png

  • 顺序存储:把 逻辑上相邻的元素存储在 物理位置上也相邻的存储单元中,元素之间的关系由存储单元的邻接关系来体现

静态分配

使用静态分配定义的顺序表,后续 表长不能表更

  • 定义顺序表

    #define MaxSize 10; // 定义线性表最大长度
    typedef struct {
            ElemType data[MaxSize]; // 用静态的“数组”存放数据元素
            int length; // 顺序表的当前长度
    } SqList; // 顺序表的类型定义
        ```
    
    
  • 初始化顺序表

    #include <stdio.h>
    #define MaxSize 10 // 定义线性表最大长度
    
    typedef struct {
            ElemType data[MaxSize]; // 用静态的“数组”存放数据元素
            int length; // 顺序表的当前长度
    } SqList; // 顺序表的类型定义
    
    void InitList(SqList &L) {
            for(int i = 0; i < MaxSize; i++) {
                    L.data[0] = 0; // 将所有数据元素设置为默认初始值 0
            }
            L.length = 0;
    }
    
    int main() {
            SqList L; // 声明一个顺序表
            InitList(L); // 初始化顺序表
            return 0;
    }
    

动态分配

  • 定义顺序表

    #define InitSize 10 // 顺序表的初始化长度
    typedef struct{
      ElemType *data; // 指示动态分配数组的指针
        int MaxSize; // 顺序表的最大容量
        int length; // 顺序表的当前长度
    } SeqList;
    
  • 初始化顺序表

    #include <stdlib.h>
    #define InitSize 10 // 顺序表的初始化长度
    typedef struct{
            ElemType *data; // 指示动态分配数组的指针
        int MaxSize; // 顺序表的最大容量
        int length; // 顺序表的当前长度
    } SeqList;
    
    void InitList(SeqList &L) {
            // 用 malloc 函数申请一片连续的存储空间
        L.data = (int *)malloc(InitSize * sizeof(int)); // 先申请 10 个长度的空间
        L.length = 0;
        L.MaxSize = InitSize;
    }
    
    // 增加动态数组的长度
    void IncreaseSize(SeqList &L, int len) {
            int *P = L.data; // 顺序表 L 的数据赋值给 p
        L.data = (int *)malloc((L.MaxSize + len) * sizeof(int)); // 再申请 10 + 5 个长度的空间
        for(int i = 0; i < L.length; i++) {
            L.data[i] = p[i]; // 将数据复制到新区域
        }
        L.MaxSize = L.MaxSize + len; // 顺序表的最大长度增加 len
        free(p); 是否原来的内存空间
    }
    
    int main() {
            SeqList L; // 声明一个顺序表
        InitList(L); // 初始化顺序表
        IncreaseSize(L, 5);
        return 0;
    }
    

顺序表的特点

  • 随机访问,即可以在 O(1) 的时间内找到第 i 个元素
  • 存储密度高,每个节点只存储数据元素
  • 拓展容量不方便(采用动态分配的时间复杂度较高)
  • 插入、删除操作不方便