24考研数据结构-线性表2

文章详细介绍了顺序表的基本操作,包括插入元素,分析了不同插入位置的时间复杂度,从最好、最坏到平均情况。同时,讨论了删除操作的实现及注意事项,并提到了按位和按值查找的方法及其时间复杂度。内容聚焦于数据结构中的顺序表这一主题,强调了操作的有效性和效率问题。
摘要由CSDN通过智能技术生成

2.3.3 顺序表的基本操作

2.3.3.1 插入操作
bool ListInsert(SqList &L, int i, int e){ 
    //判断i的范围是否有效
    if(i<1||i>L.length+1) 
        return false;
    if(L.length>MaxSize) //当前存储空间已满,不能插入  
        return false;

    for(int j=L.length; j>=i; j--){    //将第i个元素及其之后的元素后移
        L.data[j]=L.data[j-1];
    }
    L.data[i-1]=e;  //在位置i处放入e
    L.length++;      //长度加1
    return true;
}

注意:
1.数组下标与顺序表的下标,需要加入元素的第i号位置,对应的数组的位置时i-1,所以将e的值赋值给L.data[i-1],也就是顺序表的第i号位置(L.data[i-1]=e)
2.判断i的值是否有效(i<1||i>L.length+1) ,目的是防止用户在顺序表的小于1的位置插入元素(顺序表下标从1开始),并且只能在L.length+1的范围以内(当前长度+1即下一位,也不会空元素)插入元素,即元素之间不能空。
3.(L.length>MaxSize),不能让顺序表的长度大于最大长度,但是可以等于
2.3.3.2 插入操作的时间复杂度

循环:for(int j=L.length; j>=i; j–)
最好情况:新元素插入表尾,i = n+1,不用移动元素 O(1)
最坏情况:新元素插入表头,i = 1,全部元素n都需要移动 O(n)
平均情况:插入每一个位置的概率都是相等的,有n +1 个位置可以插入,所以是
1 n + 1 = p \frac {1} {n+1}=p n+11=p n ( n + 1 ) 2 ∗ p = n 2 \frac{n(n+1)}{2}*p=\frac{n}{2} 2n(n+1)p=2n,所以O(n)

在这里插入图片描述

2.3.3.3 删除操作
bool LisDelete(SqList &L, int i, int &e){ // e用引用型参数 初始值可以设置位-1
    //判断i的范围是否有效
    if(i<1||i>L.length) 
        return false;

    e = L.data[i-1]    //将被删除的元素赋值给e

    for(int j=L.length; j>=i; j--){    //将第i个后的元素前移
        L.data[j-1]=L.data[j];
    }
    L.length--;      //长度减1
    return true;
}

注意:
1.e是引用类型的,所以才能返回到main函数里边,倘若不是引用类型则会赋值给内存中main函数的e的一个复制,也就是不能在main函数里打印输出,L与&L同理。
2.(i<1||i>L.length) 是传参i的一个合法性检验,这时的i还是不能小于1,并且最大只能跟顺序表的 length一样大,不能跟插入一样修改下一位 length+1。
2.3.3.4删除操作的时间复杂度

在这里插入图片描述

2.3.3.5 知识回顾与重要考点

在这里插入图片描述

2.3.3.6 顺序表的按位查找
#define MaxSize 10            //定义最大长度 
typedef struct{
    ElemType data[MaxSize];  //用静态的“数组”存放数据元素 
    int Length;              //顺序表的当前长度
}SqList;                     //顺序表的类型定义


ElemType GetElem(SqList L, int i){
    // ...判断i的值是否合法
    if(i<1||i>L.length) 
        return false;
    else
    return L.data[i-1];      //注意是i-1
}


typedef struct{
	int  *data;//指示动态分配数组的指针
	int MaxSize; //顺序表的最大容量
	int length;  //顺序表的当前长度 
}SeqList; 

在这里插入图片描述
返回的指针的类型就是我们按位查找元素时指针读取的步长,倘若不对应则会报错,不能完成读取正确的数据

2.3.3.7 顺序表按位查找的时间复杂度

在这里插入图片描述

2.3.3.8 顺序表按值查找
#define InitSize 10            //定义最大长度 
typedef struct{
    ElemTyp *data;  //用静态的“数组”存放数据元素 
    int Length;              //顺序表的当前长度
}SqList;   

//在顺序表L中查找第一个元素值等于e的元素,并返回其位序
int LocateElem(SqList L, ElemType e){
    for(int i=0; i<L.lengthl i++)
        if(L.data[i] == e)  
            return i+1;     //数组下标为i的元素值等于e,返回其位序i+1
    return 0;               //推出循环,说明查找失败
}


基本数据类型:int float double char可以用==

结构则不能使用==判断
在这里插入图片描述

2.3.3.9顺序表按值查找的时间复杂度

在这里插入图片描述

2.3.3.10 知识回顾与重要考点

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

VengaZ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值