顺序表的插入、删除和查找(四)

简介: 详细介绍了数据结构中的顺序表

网络异常,图片无法展示
|

顺序表

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

计算一个数据元素的大小: 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)

目录
相关文章
|
5月前
|
算法 C语言
【408数据结构与算法】—顺序表的插入、删除和查找(四)
【408数据结构与算法】—顺序表的插入、删除和查找(四)
|
9月前
|
存储 C++
链表操作:插入、删除与遍历
(笔者画图不易呜呜)链表是一种基本的数据结构,它可以用来存储一系列的元素,并且支持灵活的插入、删除操作。在计算机科学中,链表常常用于构建更复杂的数据结构,如栈、队列以及图等。
193 0
|
9月前
|
存储 算法
数组算法:倒置,查找,插入,删除
数组算法:倒置,查找,插入,删除
68 0
顺序表头插头删尾插尾删以及任意位置的插入删除和顺序表中的查找
顺序表头插头删尾插尾删以及任意位置的插入删除和顺序表中的查找
|
10月前
链表学习(链表的创建,插入,删除,查找,遍历)
链表学习(链表的创建,插入,删除,查找,遍历)
86 0
|
11月前
|
算法 Java
优雅的删除链表元素
大家好,我是王有志。今天我们尝试使用多种方法,“优雅”的实现链表的删除方法。
103 0
优雅的删除链表元素
双链表全部知识总结(初始化、插入、删除、遍历)
双链表知识总结包括思路分析、代码实现
180 0
链表的插入与删除
链表的插入与删除
55 0
|
搜索推荐
查找-之二叉排序树(查找、插入、删除)
有序的线性表采用:折半/二分、插值、斐波那契查找相比顺序查找效率得到提高,但是在插入和删除时效率低(为维持数据的有序性) 在高效实现查找操作时,如何提高插入和删除的效率? 在一些应用场景:在查找时需要插入和删除
87 0
查找-之二叉排序树(查找、插入、删除)

热门文章

最新文章