顺序表的插入、删除和查找和代码讲解

举报
高彬滔 发表于 2023/03/14 14:17:28 2023/03/14
【摘要】 顺序表用顺序存储的方式实现线性表顺序存储,把逻辑上相邻的元素存储在物理位置上也相邻的存储单元中,元素之间的关系由存储单元的邻接关系来体现计算一个数据元素的大小: C语言中提供的一个函数sizeof(Elem Type) eg:sizeof(int) = 4B当然一个结构体的数据元素也可以算出来typedef struct { int num; int people;} Custo...

image.png

顺序表

用顺序存储的方式实现线性表顺序存储,把逻辑上相邻的元素存储在物理位置上也相邻的存储单元中,元素之间的关系由存储单元的邻接关系来体现

计算一个数据元素的大小: C语言中提供的一个函数sizeof(Elem Type) eg:

sizeof(int) = 4B

当然一个结构体的数据元素也可以算出来

typedef struct {
    int num;
    int people;
} Customer


sizeof(Customer) = 8B

顺序表的静态分配

define定义中的MaxSize决定了最大数组的长度,

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

初始化一个顺序表

void InitList(SqList $L){
    L.length=0;   //顺序表初始长度为0
}

静态的顺序表当被声明后就不容易被修改

顺序表的动态分配

#define MaxSize 10 //定义最大长度
typedef struct{
    ElemType *data; //指针动态分配数组的指针
    int MaxSize;  //顺序表最大容量
    int length //顺序表当前长度
}SqList;  //顺序表的类型定义(动态分配方式)

c语言中的malloc、free函数分别可以动态的申请和释放内存空间,malloc函数返回一个指针,需要强制转性为你定义的数据元素类型指针;在c++中可以用new、delete这两个关键字来实现

L.data=(ElemType *) malloc(sizeof(ElemType *InitSize))

顺序表的插入

ListInsert($L,i,e):插入操作,在表L中的第i个位置上插入指定元素e

实现的基本思路就是把原L中第i个元素及之后的元素后移

void ListInsert(SqList $L,int i,int e){
    for(int j=L.length;j>=i;j--)
        L.data[j]=L.data[j-1];
    L.data[i-1]=e;
    L.length++;
}

在实现的过程中需要判断i是否是合法的,同时要考虑顺序表的长度。改进后的代码:

void ListInsert(SqList $L,int i,int e){
    if(i<1 || i>L.length+1)  //判断i是否合法
        return false;
    if(L.length>=MaxSize)  //储存空间已满,不能插入
        return false;
    for(int j=L.length;j>=i;j--)
        L.data[j]=L.data[j-1];
    L.data[i-1]=e;
    L.length++;
    return true;
}

时间复杂度:

  • 最好情况:新元素插入到表尾,不用移动元素,T(n)= O(1)
  • 最坏情况:新元素插入到表头,T(n)= O(n)
  • 平均情况:T(n)= O(n)

顺序表的删除

bool ListDelete(SqList $L, int i.int &e){
    if(i<1 || i>L.length)   //判断i是否合法
        return false;
    e=L.data[i-1];          //删除的元素赋给e
    for(int j=i;j<L.length;j++)     //将第i个位置后的元素前移
        L.data[j-1]=L.data[j];
    L.length--;    //线性表的长度减1
    retrun true;
}

时间复杂度:

  • 最好情况:删除表尾元素,不用移动元素,T(n)= O(1)
  • 最坏情况:删除表头元素,将n+1个元素全部向前移动,T(n)= O(n)
  • 平均情况:T(n)= O(n)

顺序表的查找

按位查找

GetElem(L,i):按位查找操作,获取表L中的第i个位置的元素的值

ElemType  GetElem(SeqList L, int i){
    return L.data[i-1];
}
 

时间复杂度:T(n)=O(n)

按值查找

LocateElem(L,e):按值查找操作,在表L中查找具有给定关键字值的元素

int LocateElem(SeqList L, ElemType e){
    for(int i=0; i<L.length; i++)
        if(L.data[i]==e)
            return i+1;
    return 0;
}

在顺序表L中查找第一个元素值等于e的元素,并返回其位序,当数组中的下标为i的元素的值等于e的时候,返回位序i+1

时间复杂度:T(n)=O(n)

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。