给定一个顺序存储的线性表,请设计一个函数删除所有值大于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 生成】
这个算法存在以下问题和不完善之处:
在循环的条件中,使用了i<L->Last
,这样会导致最后一个元素无法被判断和删除。应该改为i<=L->Last
。
在删除元素时,每次都将剩余元素向前移动,所以会有很多重复的元素移动操作。改进的建议是使用两个指针,一个指向需要删除的位置,另一个指向下一个需要保留的位置,将需要保留的元素移动到前面,最后更新数组长度。
下面是改进后的代码:
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,也就不会将那些数删去