顺序表插入和删除

#define MaxSize 10
#include <stdio.h>
typedef struct {
    int data[MaxSize];
    int length;
}SqList;
//在L的位序i 插入元素e
//void ListInsert(SqList &L, int i, int e){
//    //i的合法值 [1,length+1]
//    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
//}
bool ListInsert(SqList &L, int i, int e){
    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;
}

void InitList(SqList &L){
    for(int i=0; i<MaxSize; i++)
        L.data[i] = 0;    //将所有数据元素设置为默认初始值
    L.length = 0;          //顺序表初始长度为0

}

int main(){
    SqList L;
    InitList(L);

    ListInsert(L, 3 ,3);
    return 0;
}

(好的算法应该有健壮性,所以后面优化了一下)

时间复杂度分析

最好情况:新元素插入到表尾,不需要移动元素 i = n+1 循环0次  O(1)

最坏情况: 新元素表头 需要将原有n个元素全部向后移动

i=1,循环n次,最坏时间复杂度O(n)

平均情况: 假设新元素插入到任何一个位置概率相同,即i = 1, 2, 3,....,length+1的概率都是p=1/(n+1)

i=1 循环n次

i=2 循环n+1次

...

i=n+1时,循环0次

平均循环次数 np+(n-1)*p+(n-2)*p+.......+1*p=[n*(n+1)/2] *[1/(n+1)]=n/2 

平均时间复杂度O(n)

删除操作

bool ListDelete(SqList &L, int i, int &e){
    if(i<1 || i>L.length) //判断i的范围是否有效
        return true;
    e = L.data[i-1];
    for(int j=i; j<L.length; j++)
        L.data[j-1]=L.data[j];
    L.length--;
    return true;
}

(小注:引用符号e,带回)

最好情况:最后一个元素 O(1)

最坏情况:表头元素 O(n)

平均情况O(n)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值