[解決済み】リンクリストのコピーコンストラクタを作成する
質問
これは宿題です
C++の授業でリンクリストのクラスを実装しているのですが、コピーコンストラクタが非常に分かりにくくなっています。
リンクリストはElemsと呼ばれる構造体で構成されています。
struct Elem
{
int pri;
data info;
Elem * next;
};
Elem * head;
info は別個のカスタムクラスで、Elem.Info に格納されます。
コピーコンストラクタのシグネチャは
linkedList::linkedList( const linkedList &v )
私が抱えている問題のほとんどは、自分のロジックを実際にコードとして書くことです。
私の一般的な考え方は
- headをv.headに設定する(head = v.head)
- Elemの値をvの値に設定 (pri = v.pri , info = v.info , next = v.next)
- 手順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
のように、浅いコピーを意図しているのでなければ、不正確です。
リンクリストのようなコンテナをコピーする場合、おそらくディープコピーにしたいでしょうから、新しいノードを作成してデータのみをコピーする必要があります。そのため
next
と
prior
新しいリストのノードのポインタは、作成した新しいノードを参照する必要があります。
具体的には
のノードではなく、そのリストのためのノードです。これらの新しいノードは、元のリストの対応するデータのコピーを持つので、新しいリストは値によって、またはディープコピーと考えることができる。
浅いコピーと深いコピーの違いを表した図がこちらです。
において、どのように ディープコピー の部分は、どのノードも古いリストのノードを指していません。シャローコピーとディープコピーの違いについて詳しくは、Wikipediaの記事 オブジェクトコピー .
関連
-
[解決済み】C++ - 解放されるポインタが割り当てられていないエラー
-
[解決済み】 != と =! の違いと例(C++の場合)
-
[解決済み】Cygwin Make bash コマンドが見つかりません。
-
[解決済み】デバッグアサーションに失敗しました。C++のベクトル添え字が範囲外
-
[解決済み] 既に.objで定義されている-二重包含はない
-
[解決済み】標準ライブラリにstd::endlに相当するタブはあるか?
-
[解決済み】C++ - 適切なデフォルトコンストラクタがない [重複]。
-
[解決済み] to_string は std のメンバーではない、と g++ が言っている (mingw)
-
[解決済み] C++で、あるコンストラクタを別のコンストラクタから呼び出す(コンストラクタ・チェイニングを行う)ことは可能ですか?
-
[解決済み] コピーアンドスワップ慣用句とは?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] テスト
-
[解決済み】コンストラクターでのエラー:識別子を期待されますか?
-
[解決済み】C++ 非推奨の文字列定数から「char*」への変換について
-
[解決済み】Visual Studio 2015で「非標準の構文; '&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】エラー。switchステートメントでcaseラベルにジャンプする
-
[解決済み】Visual C++で "Debug Assertion failed "の原因となる行を見つける。
-
[解決済み】オブジェクト引数のない非静的メンバ関数の呼び出し コンパイラーエラー
-
[解決済み】CMakeエラー at CMakeLists.txt:30 (project)。CMAKE_C_COMPILER が見つかりませんでした。
-
[解決済み】C++ - 適切なデフォルトコンストラクタがない [重複]。
-
[解決済み】なぜ、サイズ8の初期化されていない値を使用するのでしょうか?