顺序表的基本操作

顺序表的基本操作

插入

#include<stdio.h>
#include<stdlib.h>
#define InitSize 10         //定义最大长度
typedef struct{
    int *data;
    int MaxSize;
    int length;
}SeqList;
void InitList(SeqList &L){
    L.data = (int*)malloc(sizeof(int)*InitSize);
    L.length=0;
    L.MaxSize=InitSize;
    for(int i=0;i<L.MaxSize;i++){//赋初值
        L.data[i]=0;
    }
    int a;
    int i=0;
    while(1){//录入数据
        if(L.length==L.MaxSize){
            break;
        }
        printf("请输入一个整数(输入负数结束):");
        scanf("%d",&a);
        if(a<0){
            break;
        }
        L.data[i]=a;
        L.length++;
        i++;
    }
}
void dispaly(SeqList L){//遍历数组
    printf(" ");
    for(int i=0;i<L.length;i++){
        printf("%d ",L.data[i]);
    }
    printf("\n");
}
bool insertList(SeqList &L,int i,int e){
    if(i<1||i>L.length+1)//位序合法值的判断
        return false;
    if(L.length>=L.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;
}
int main(){
    int index,e;
    SeqList L;
    InitList(L);
    dispaly(L);
    printf("请输入要插入的位置:");
    scanf("%d",&index);
    printf("请输入要插入的数值:");
    scanf("%d",&e);
    insertList(L,index,e);
    dispaly(L);
    return 0;
}

最好情况:新元素插入到表尾,不需要移动元素

​ i=i+1,循环0次:最好时间复杂度 = O(1)

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

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

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

​ i=1,循环n次;

​ i=2,循环n-1次;

​ i=3,循环n-2次;…… i=n+1时,循环0次
平 均 循 环 次 数 = n p + ( n − 1 ) p + … … + 1 ∗ p = [ n ( n + 1 ) / 2 ] ∗ 1 / ( n + 1 ) = n / 2 平均循环次数 = np + (n-1)p + …… + 1*p =[n(n+1)/2]*1/(n+1)=n/2 =np+(n1)p++1p=[n(n+1)/2]1/(n+1)=n/2

平均时间复杂度=O(n)


删除

#include<stdio.h>
#include<stdlib.h>
#define InitSize 10         //定义最大长度
typedef struct{
    int *data;
    int MaxSize;
    int length;
}SeqList;
void InitList(SeqList &L){
    L.data = (int*)malloc(sizeof(int)*InitSize);
    L.length=0;
    L.MaxSize=InitSize;
    for(int i=0;i<L.MaxSize;i++){//赋初值
        L.data[i]=0;
    }
    int a;
    int i=0;
    while(1){//录入数据
        if(L.length==L.MaxSize){
            break;
        }
        printf("请输入一个整数(输入负数结束):");
        scanf("%d",&a);
        if(a<0){
            break;
        }
        L.data[i]=a;
        L.length++;
        i++;
    }
}
void dispaly(SeqList L){//遍历数组
    printf(" ");
    for(int i=0;i<L.length;i++){
        printf("%d ",L.data[i]);
    }
    printf("\n");
}
bool insertList(SeqList &L,int i,int e){
    if(i<1||i>L.length+1)
        return false;
    if(L.length>=L.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;
}
bool ListDelete(SeqList &L,int i,int &e){//e为引用值
    if(i<1||i>L.length)		//位序合法值的判断
        return false;
    e=L.data[i-1];
    for(int j=i;j<L.length;j++)
        L.data[j-1]=L.data[j];
    L.length--;
    return true;
}
int main(){
    int index,e;
    SeqList L;
    InitList(L);
    dispaly(L);
    printf("请输入要插入的位置:");
    scanf("%d",&index);
    printf("请输入要插入的数值:");
    scanf("%d",&e);
    insertList(L,index,e);
    dispaly(L);
    e=-1;
    if(ListDelete(L,3,e))//引用类型,e的值改变
        printf("已删除第三个元素,删除的元素值为=%d\n",e);
    else
        printf("位序不合法\n");
    dispaly(L);
    return 0;
}

最好情况:删除表尾元素,不需要移动其他元素

​ i=n,循环0次;最好时间复杂度 = O(1)

最坏情况:删除表头元素,需要将后续的n-1个元素全部都向前移动

​ i=1,循环n-1次;最快时间复杂度 = O(n)

平均情况:假设删除任何一个元素的概率相同,即i=1,2,3,…,length的概率都是p=1/n

​ i=1,循环n-1次;

​ i=2,循环n-2次;

​ i=3,循环n-3次;…… i=n时,循环0次
平 均 循 环 次 数 = ( n − 1 ) p + ( n − 2 ) p + … … + 1 ∗ p = [ n ( n − 1 ) / n ] ∗ 1 / n = ( n − 1 ) / 2 平均循环次数=(n-1)p+(n-2)p+……+1*p=[n(n-1)/n]*1/n=(n-1)/2 =n1)p+(n2)p++1p=[n(n1)/n]1/n=(n1)/2
平均时间复杂度=O(n)

运行结果

在这里插入图片描述

总结:

在这里插入图片描述

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值