顺序表的插入删除

本文详细介绍了顺序表的插入和删除操作,包括操作实现、示例代码以及它们的时间复杂度分析,分别在最好、最坏和平均情况下讨论了效率问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

顺序表的基本操作--插入

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

#include<stdio.h>
#define MaxSize 10  //定义最大长度
typedef struct 
{
    int data[MaxSize];//用静态的“数组”存放数据元素
    int length;       //顺序表的当前长度
}SqList;              //顺序表的类型定义
bool 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];//将第i个元素以及之后的与奈斯后移
    }
    L.data[i-1]=e;//在位置i处放入e
    L.length++;
    return true;
}
int main()
{
    SqList L;     //声明一个顺序表
    InitList(L);  //初始化顺序表
    //...
    if(ListInsert(L,3,3))
       printf("已插入第3个元素);
    else
       printf("位序i不合法,插入失败\n");
    return 0;
}

插入操作的时间复杂度

最好情况:新元素插入到表尾,不需要移动元素  T(n)=O(1)

最坏情况:新元素插入到表头,需要将原有的n个元素全都向后移动 T(n)=O(n)

平均情况:假设新元素插入到任何一个位置的概率相同,即i=1,2,3,4,...,length+1的概率都是p=1/(n+1) ,i等于1时循环n次,i=2时循环n-1次,...,i=n+1时,循环0次。平均循环次数=np+(n-

1)P+...+1*p=(n*(n+1)/2)*(1/(n+1))=n/2;T(n)=O(n/2)=O(n)

顺序表的基本操作--删除

#include<stdio.h>
#define MaxSize 10  //定义最大长度
typedef struct 
{
    int data[MaxSize];//用静态的“数组”存放数据元素
    int length;       //顺序表的当前长度
}SqList;              //顺序表的类型定义
bool ListDelete(SqList &L,int i,int& e)
{
    if(i<1||i>L.length+1)//判断i的范围是否有效
       return false;
    e=L.data[i-1];
    for(int j=i;j<L.length;j++)
    { 
        L.data[j]=L.data[j-1];//将第i个元素以及之后的与奈斯后移
    }
    L.length--;
    return true;
}
int main()
{
    SqList L;     //声明一个顺序表
    InitList(L);  //初始化顺序表
    //...
    int e=-1;
    if(ListInsert(L,3,e))
       printf("已删除第3个元素,删除元素值为=%d\n",e);
    else
       printf("位序i不合法,删除失败\n");
    return 0;
}

最好情况:删除表微元素,不需要移动其他元素 i=n,循环0次:最好时间复杂度=O(1)

最坏情况:删除表头元素,需要将后续的n-1个元素全都向前移动 i=1,循环n-1次,最坏时间复杂度=O(n)

平均情况:假设删除任何一个元素的概率相同,即i=1,2,3,4...,length的概率都是p=1/n;i=1时循环n-1次,i=2时循环n-2次......i=n时循环0次  平均循环次数=(n-1)*p+(n-2)*p+(n-3)*p+...+1*p=(n*(n-1))/2*(1/n)=(n-1)/2  T(n)=O(n)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

写不出bug的小李

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

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

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

打赏作者

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

抵扣说明:

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

余额充值