疑问:顺序表A和B,且都递增有序,试写一算法,从A中删除与B中相同的元素

tianshi1017 2012-08-24 10:53:43
书上的答案是:
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这个没有排除么?????
...全文
893 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Mike_Beijing2012 2012-11-10
  • 打赏
  • 举报
回复
//貌似这样子可以: 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; } } } }
tkminigame 2012-11-10
  • 打赏
  • 举报
回复
Python就一句话
A[:] = [x for x in A if x not in B]
hqw19881118 2012-11-10
  • 打赏
  • 举报
回复
好像是呀,若A中的元素存在相同的,楼主的两种算法就都有问题
supersonic0410 2012-09-02
  • 打赏
  • 举报
回复
既然你分析出书上的不对,那就相信自己的结论,去修改它的逻辑。

你写的也有问题。当动态删除列表中元素后,后续元素索引都往前+1了。
所以要跳出循环继续比较k=j位置上的新值。

参考一下(我没调试过,你如果有程序试一下,结果告知一声):

if(B.data(i)<=A.data(j)){ // 如果
if(B.data[i]==A.data[j]){
deleteList(A,j);
}
k=j;
break;
}
蜡笔小新啦 2012-08-30
  • 打赏
  • 举报
回复
若顺序表是数字的话,则建立一个数组c[10],
先循环b,将b中含有的数字按照其本来顺序放入c中,例如:3放入c[3],且c[3]++;
在循环a,这样判断:
if (c[a[i]])
删除a[i];
这样又存在一个问题就是你如何去删除a[i],其实也可以赋值到另一个数组中!这样减少移位!
carter91620 2012-08-24
  • 打赏
  • 举报
回复
如果先判断相等删除,再判断是否大于更新k。那么如果A和B中某个值相等,那么你每次执行外部循环时,内部循环的起始值都不是最优的。
比如说k=1,B[i]=A[j];那么下一次执行内部循环时1为起始值,而起始最优值应该是j。
所以应该是先判断是否大于等于,再判断删除。

但说的书上的循环,外部循环应该是A,内部循环应该是B,程序才是对的。

33,010

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧