这个算法有什么问题?

给定一个顺序存储的线性表,请设计一个函数删除所有值大于min而且小于max
的元素。删除后表中剩余元素保持顺序存储,并且相对位置不能改变。
pta提示部分正确

List Delete( List L, ElementType minD, ElementType maxD ){
    int count=0;
   for(int i=0;i<L->Last;i++){
        if(L->Data[i]>minD&&L->Data[i]<maxD){
        count++;}
        else{
            L->Data[i-count]=L->Data[i];
        }
        }
        L->Last-=count;

   return L;

}


【以下回答由 GPT 生成】

这个算法存在以下问题和不完善之处:

  1. 在循环的条件中,使用了i<L->Last,这样会导致最后一个元素无法被判断和删除。应该改为i<=L->Last

  2. 在删除元素时,每次都将剩余元素向前移动,所以会有很多重复的元素移动操作。改进的建议是使用两个指针,一个指向需要删除的位置,另一个指向下一个需要保留的位置,将需要保留的元素移动到前面,最后更新数组长度。

下面是改进后的代码:

List Delete( List L, ElementType minD, ElementType maxD ){
    int i, j;
    int count=0;
    for(i=0, j=0; i<=L->Last; i++){
        if(L->Data[i]>minD && L->Data[i]<maxD){
            count++;
        }
        else{
            L->Data[j++]=L->Data[i];
        }
    }
    L->Last = j-1;
    return L;
}

这样改进后的代码可以更高效地删除元素,并保持相对位置不变。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

最后一个或者最后几个都是应该删除的值的话就不会执行else,也就不会将那些数删去