1. ホーム
  2. c++

[解決済み】リンクリストのコピーコンストラクタを作成する

2022-02-07 20:27:05

質問

これは宿題です

C++の授業でリンクリストのクラスを実装しているのですが、コピーコンストラクタが非常に分かりにくくなっています。

リンクリストはElemsと呼ばれる構造体で構成されています。

struct Elem 
    {
        int pri;
        data info;
        Elem * next;
    };
    Elem * head;

info は別個のカスタムクラスで、Elem.Info に格納されます。

コピーコンストラクタのシグネチャは

linkedList::linkedList( const linkedList &v )

私が抱えている問題のほとんどは、自分のロジックを実際にコードとして書くことです。

私の一般的な考え方は

  1. headをv.headに設定する(head = v.head)
  2. Elemの値をvの値に設定 (pri = v.pri , info = v.info , next = v.next)
  3. 手順2を繰り返し、反復します。

これが一般的な考え方でしょうか。

何かお手伝いいただけると助かります。 これは宿題なので、直接の回答はご遠慮ください。

お時間をいただきありがとうございました。

====================================================================================================================================================================

皆さん、お忙しい中ありがとうございました。

なんとなくわかったような気がする。

//Copy Constructor
LinkedList::LinkedList( const LinkedList &v )
{
Elem * p1 = 0;//current
Elem * p2 = 0;//next

if( v.head == 0 )
    head = 0;

else
{
    head = new Elem;
    head -> pri = v.head -> pri;
    head -> info = v.head -> info;

    p1 = head;
    p2 = v.head -> next;
}

while( p2 )
{
    p1 -> next = new Elem;
    p1 = p1 -> next;
    p1 -> pri = p2 -> pri;
    p1 -> info = p2 -> info;

    p2 = p2 -> next;
}
p1 -> next = 0;
}

これで間違いないですね。参考までに論理的な絵を描いてみましたが、特に問題はありませんでした。

どのように解決するのですか?

ステップ1とステップ2の一部に注意する必要があります。ステップ1では、新しいノードを割り当てて、それを head . ステップ 2 の next = v.next のように、浅いコピーを意図しているのでなければ、不正確です。

リンクリストのようなコンテナをコピーする場合、おそらくディープコピーにしたいでしょうから、新しいノードを作成してデータのみをコピーする必要があります。そのため nextprior 新しいリストのノードのポインタは、作成した新しいノードを参照する必要があります。 具体的には のノードではなく、そのリストのためのノードです。これらの新しいノードは、元のリストの対応するデータのコピーを持つので、新しいリストは値によって、またはディープコピーと考えることができる。

浅いコピーと深いコピーの違いを表した図がこちらです。

において、どのように ディープコピー の部分は、どのノードも古いリストのノードを指していません。シャローコピーとディープコピーの違いについて詳しくは、Wikipediaの記事 オブジェクトコピー .