-1

リンクリストクラスがあり、次の2つの問題があります。

  1. 私のコピー代入演算子は正確なリストをコピーしません
  2. リンクリストを使用してオーバーロードされた出力を実行する方法がわかりません。基本的にどのように機能するかはわかりますが、リンクリストで迷子になります。

更新:コピー代入演算子がリストの逆を表示するのはなぜですか?

list& list::operator =(const list &l){
    while (p!=NULL)
       del();
    Node* current=l.p;
    while(current!=NULL){
       insert(current->x); 
       current=current->next;
       }

10--2--NULLの場合2--10--NULLを出力します

4

1 に答える 1

1

代入演算子の最後に、これをnullポインターにpする必要があります。そうしないと、ループ currentを終了できません。への以前の呼び出しによってすでに設定されている必要があります。whilepinsert

リストに割り当てるときにリストにすでに要素が含まれている場合はどうなりますか?本当に追加しますか、それとも既存の要素を最初に削除しますか?

printメンバーでは、ループはNULLになるまで実行され、q終了した後、NULLかどうかをテストしqます...もちろんそうです。したがって、リストの後には常にNULLを出力します。

あなたはこれmainを持っています、それはリストを破壊します:

l1.~list();

したがって、次の行は未定義の動作です。すでに破棄されているオブジェクトにアクセスすると、オブジェクトは再びスコープ外になり、そのデストラクタが実行されます。これも、オブジェクトがすでに破棄されているため、未定義の動作です。デストラクタを手動で呼び出す必要はありません。これがデストラクタの要点です。オブジェクトがスコープ外になると、デストラクタは自動的にクリーンアップします。

編集:代入演算子は、リストを順番に処理するため、リストを逆にinsertコピーしますが、コピーされたリストの先頭に各要素を配置するため、最初の要素をコピーし、次に2番目の要素をその前に配置し、次に3番目の要素をその前に配置します等

リストをコピーするには、コピーした要素を同じ順序で配置する必要があります。つまり、各要素を最初ではなく最後に挿入します。

于 2012-10-25T19:20:27.260 に答える