顺序表的定义

顺序表是指用顺序存储的方式实现线性表

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

【看到这是否会和我有同样的疑问:顺序表和数组是一样的吗?这个问题可以参考 顺序表和数组(易混淆) 这篇文章的解释】

顺序表的实现

静态分配

#define MaxSize 10			//定义最大长度
typedef struct{
    ElemType data[MaxSize];	//用静态的“数组”存放数据元素,ElemType就是顺序表中存放的数据元素类型
    int length;				//顺序表的当前长度
}SqList;					//顺序表的类型定义(静态分配方式)

具体的代码

#include <stdio.h>
#define MaxSize 10

typedef struct{
    int data[MaxSize];
    int length;
}SqList;

void InitList(SqList* L){
    L->length = 0;		//顺序表初始长度为0,不可省略
}

int main(){
    SqList L;
    InitList(&L);
    //....
    return 0;
}

缺点:顺序表的长度刚开始确定后就无法更改(存储空间是静态的)

动态分配

#define InitSize 10			//顺序表的厨师长度
typedef struct{
    ElemType* data;			//指示动态分配数组的指针(指向顺序表中的第一个数据元素)
    int MaxSize;			//顺序表的最大容量
    int length;				//顺序表的当前长度
}SeqList;					//顺序表的类型定义(动态分配方式)

在 C 语言中,malloc 和 free 函数用于动态申请和释放内存空间
(对 malloc 函数还不理解的话,可以阅读 【malloc()函数详解(动态内存开辟函数)】这篇文章)

具体的代码

#include <stdio.h>
#define InitSize 10

typedef struct{
    int* data;
    int MaxSize;
    int length;
}SeqList;

void InitList(SeqList* L){
    L->data = (int*)malloc(InitSize*sizeof(int)); //用 malloc 函数申请一片连续的存储空间
    L->length = 0;
    L->MaxSize = InitSize;
}

void IncreaseSize(SeqList* L, int len){
    int *p = L->data;
    L->data = (int*)malloc((L->MaxSize+len)*sizeof(int));
    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 个元素
  • 存储密度高,每个节点只存储数据元素(在链表中每个节点还需要存储指针)
  • 拓展容量不方便(即采用动态分配的方式实现,拓展长度的时间复杂度也比较高)
  • 插入删除操作不方便,需要移动大量的元素

本文主要参考《王道计算机考研 数据结构》课程视频

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐