私は現在、「Programming:Principles and Practice using C++」の第17章にあり、二重リンクリストのコードを発見しました。これまでにこのコードセットについて質問がありましたが(たとえばMember access in a doubly-linked list)、質問/回答されていない質問があります。ポインタと二重リンクリスト
コードは基本的に "Odin"の前身として "Freya"を配置し、 "Odor"を "Thor"の前身とし、その逆を後継者とします。コードは以下の通りである。私が知りたいのですがどのような
struct Link {
string value;
Link* prev;
Link* succ;
Link(const string& v, Link* p = nullptr, Link* s = nullptr)
: value(v), prev(p), succ(s) {}
};
int main()
{
Link* norse_gods = new Link{ "Thor", nullptr, nullptr };
norse_gods = new Link{ "Odin", nullptr, norse_gods };
norse_gods->succ->prev = norse_gods;
norse_gods = new Link{ "Freya", nullptr, norse_gods };
norse_gods->succ->prev = norse_gods;
}
はそのコード理由:
norse_gods = new Link{ "Odin", nullptr, norse_gods }
は古いアドレスを指すことが可能である:new Link{ "Thor", nullptr, nullptr }
、およびトールオーディンの後継作りますnorse_god
はすでに新しいアドレスを指しているはずです:new Link{ "Odin", nullptr, norse_gods }
?私が逃している注文や評価やコンセプトはありますか?
コンストラクタにパラメータとして 'norse_gods'を渡して、' return 'の値を使って 'norse_gods'に代入します(以前に保持されていた変数の値を置き換えます)。 – UnholySheep
' x = x +左側の「x」は「新しい値」で、右側の「x」は「古い値」 – anatolyg
このコードのフォーマットは誤解を招くことがあります。オーディンをリストに追加することは、新しいリンク{"Odin"、..}とnorse_gods-> succ-> prev = norse_gods; Freyaの場合も同様です。したがって、空白行が必要な場合は、それらの真ん中ではなく、これらの文のグループの前にそれらを置くことは論理的です。 –