2301_79683887 2023-09-12 20:34 采纳率: 70.6%
浏览 1
已结题

这个算法有什么问题?

给定一个顺序存储的线性表,请设计一个函数删除所有值大于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;

}


  • 写回答

2条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-09-12 22:16
    关注

    【以下回答由 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;
    }
    

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



    【相关推荐】



    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 9月21日
  • 已采纳回答 9月13日
  • 创建了问题 9月12日