顺序表中有效元素的长度_408数据结构之顺序表进阶(1)

51e47731cc63eda95e5e82e6b466e6dc.png

此文章系列为保存考研复习时的所有代码

顺序表进阶:

  • 从顺序表中删除具有最小值的元素(假设唯一)并有函数返回被删元素的值,空出的位置由最后一个元素填补,若顺序为空则显示错误信息并退出运行:
bool DeleteSqlistMin(Seqlist *p,int * x )
{
    if(p->size==0)
        return false;
    int min=p->array[0];
    int i=0;int temp=0;
    for(i=0;i<p->size;i++)
    {
        if(min>p->array[i])
        {
            min=p->array[i];
            temp=i;
        }
    }
    p->array[temp]=p->array[p->size-1];
    p->size--;//这里答案上写了要删除最后一项,但根据题意,本人认为无伤大雅
    return true;
}

526384380a9df4f27721555651432ec9.png
  • 设计一个高效算法,将顺序表L的所有元素逆置,要求算法的空间复杂度为O(1):
bool ReverseSqlist(Seqlist *L)//由于题目只要求了空间复杂度,所以刚拿到题目就想到了用双循环冒泡法
{
    if(L->size==0)
        return false;
    int temp=0;
    int i=0;
    int j=0;
    for(i=0;i<L->size-1;i++)
        for(j=0;j< L->size-i-1;j++)
        {   
            temp=L->array[j]; 
            L->array[j]=L->array[j+1];
            L->array[j+1]=temp;
        }
    return true;
}

bool ReverseSqlist2(Seqlist *L)//标答给出的折半互换法
{
    if(L->size==0)
        return false;
    int temp=0;
    int i=0;
    for(i=0;i<=L->size/2;i++)
        {   
            temp=L->array[i]; 
            L->array[i]=L->array[L->size-i-1];
            L->array[L->size-i-1]=temp;
        }
    return true;
}

e78ef9ce474a04aea2967a622c5abb60.png
  • 对长度为n的顺序表L,编写一个时间复杂度为O(n),空间复杂度为O(1)的算法,该算法删除线性表中所有值为x的数据元素:
bool DeleteElem(Seqlist * L,int x )
{
    if(L->size==0)
        return false;
    int count= 0;
    int distance =0;
    int i=0;
    for(i=0;i<L->size-1;i++)
    {
        if(L->array[i]==x)
        {
            count++;
        }
        else
            L->array[i-count]=L->array[i];
    }
    L->size-=count;
 return true;
}

75a4bd35626070128165d66fd6aef3ce.png
  • 从有序顺序表中删除旗帜在给定值s与t之间(s<t)的所有元素,如果不合理则显示错误信息并退出运行:
bool DelteBtwElem(Seqlist * L,int s,int t )
{
    int count_s=0;
    int count_t=0;
    for(int i = 0;i<L->size;i++)
    {
        if(L->array[i]==s)
        {
            count_s=i;
            break;
        }
        else if(L->array[i]!=s&&i==L->size-1)
        {    
            printf("can not found s! n");
            return false;
        }
    }
        for(int i = 0;i<L->size;i++)
    {
        if(L->array[i]==t&& (L->array[i+1]>L->array[i]||i==L->size-1))
        {
            count_t=i;
            break;
        }
        else if(L->array[i]!=t&&i==L->size-1)
        {    
            printf("can not found t! n");
            return false;
        }
    }
    for(int i = count_t  ; i<L->size;i++)
    {
        L->array[i- count_s -2]=L->array[i+1];
    }
    L->size-= count_t - count_s +1;
    return true;
}

b6e5c5e37ce0879b834917e0957015f1.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值