首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

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

2013-04-09 
疑问:顺序表A和B,且都递增有序,试写一算法,从A中删除与B中相同的元素书上的答案是:void SubListvoid (SeqL

疑问:顺序表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]

热点排行