[解決済み] リンクリストのコピーコンストラクタの作成
質問
これは宿題です
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の記事 オブジェクトコピー .
関連
-
[解決済み】非静的メンバ関数への参照を呼び出す必要がある
-
[解決済み】Visual Studio 2015で「非標準の構文。'&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み] error: 'ostream' does not name a type.
-
[解決済み】C++の余分な資格エラー
-
[解決済み] gdbを使用してもデバッグシンボルが見つからない
-
[解決済み】std::cin.getline( ) vs. std::cin
-
[解決済み] 配列のベクトルを扱う正しい方法
-
[解決済み】'std::cout'への未定義の参照
-
[解決済み] 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++でint型に無限大を設定する
-
[解決済み】浮動小数点例外エラーが発生する: 8
-
[解決済み】C++プログラムでのコンソールの一時停止
-
[解決済み] 非静的データメンバの無効な使用
-
[解決済み】CMakeエラー at CMakeLists.txt:30 (project)。CMAKE_C_COMPILER が見つかりませんでした。
-
[解決済み] 解決済み] `pthread_create' への未定義の参照 [重複] [重複
-
[解決済み] 数値定数の前にunqualified-idを付けて、数値を定義することを期待する。
-
[解決済み】Enterキーを押して続行する
-
[解決済み】Eclipse IDEでC++エラー「nullptrはこのスコープで宣言されていません」が発生する件
-
[解決済み] 変数サイズのオブジェクトが初期化されないことがある c++