3

私は C++ の演習に取り組んでおり、リストから要素を削除して残りを左にシフトする方法を理解しようとしています。きちんとした解決策があるのだろうか。これが私のバージョンです、それは仕事をしているようですが、もっと良い方法があると感じています:

Account AccountList::remove(int i){
if(i>=0 && i<size()) {
    for (int n = i; n < size(); n++) {
        if(i+1!=size()) {
            aList[n]=aList[n+1];
        }
    }
    sz--;
    return aList[i];
} else {
    return Account();
}
}
4

2 に答える 2

4

これには2つの問題があります。

  1. 削除された要素を返すのではなく、次の要素で上書きして返します。これはあなたの意図ではないと思います。
  2. ループ範囲が正しくありません。このループでは、n = size() - 1 の場合、インデックス n+1 で配列の境界を超えます。

修正したものを以下に示します。

Account AccountList::remove(int i)
{
  if(i>=0 && i<size()) 
  {
    Account a = aList[i]
    for (int n = i; n < size() - 1; n++) 
    {
        if(i+1!=size()) 
        {
            aList[n]=aList[n+1];
        }
    }
    sz--;
    return a;
  } else 
  {
    return Account();
  }
}
于 2012-07-29T18:59:52.190 に答える
1

これを行っている場合、リストを正しく実装していません。O(1)リストは、要素を削除するための複雑さを持つ必要があります。それは配列またはベクトルのように見えます。

リストは通常​​、相互にリンクされたノードで構成されます。この場合、問題のノードを削除し、前のノードが削除するノードの後のノードを指すようにするだけで済みます。

于 2012-07-29T18:57:44.653 に答える