疑问:顺序表A和B,且都递增有序,试写一算法,从A中删除与B中相同的元素
书上的答案是:
void SubListvoid (SeqList *A,SeqList B){
int i,j,k;
k=1;
for(i=1;i<=B->length;i++){
for(j=k;j<=A->length;j++){
if(B.data(i)>=A.data(j)){
k=j;
break;
}else{
continue;
}
if(B.data[i]==A.data[j]){
deleteList(A,j);
}
}
}
}
我觉得这一段的逻辑不对,应该是:
if(B.data[i]==A.data[j]){
deleteList(A,j);
}
if(B.data(i)>A.data(j)){
k=j;
continue;
}else{
break;
}
请大家帮忙看看
比如:比如,A 中的数据是{1.3,4,5,6},B中的数据是{4,7},按照答案的逻辑,当B为4的时候,循环A开始比较,A取1,此时满足if(B.data(i)>=A.data(j)),结果就break终止了A的循环,然后再取B为7开始到A中比较。
这样子的话,不是就将B=4,A=4这个没有排除么?????
[解决办法]
既然你分析出书上的不对,那就相信自己的结论,去修改它的逻辑。
你写的也有问题。当动态删除列表中元素后,后续元素索引都往前+1了。
所以要跳出循环继续比较k=j位置上的新值。
参考一下(我没调试过,你如果有程序试一下,结果告知一声):
if(B.data(i)<=A.data(j)){ // 如果
if(B.data[i]==A.data[j]){
deleteList(A,j);
}
k=j;
break;
}
[解决办法]
//貌似这样子可以:
void SubList(SeqList *A,SeqList B)
{
int i,j,k;
k=1;
for(i=1;i<=B.length;i++)
{
for(j=k;j<a->length;j++)
{
if(A->data[j]>=B.data[i])
{
k=j;
if(A->data[j]==B.data[i])
DeleteList(A,j);
break;
}
}
}
}
------解决方案--------------------
好像是呀,若A中的元素存在相同的,楼主的两种算法就都有问题
[解决办法]
Python就一句话
A[:] = [x for x in A if x not in B]