对链接列表的困惑

Tos*_*nAl 2 c++ linked-list c++11

我阅读了使用c ++ book编写的编程原理和实践中编写的代码.

struct Link {
string value;
Link* prev;
Link* succ;
Link(const string& v, Link* p = nullptr, Link* s = nullptr)
: value{v}, prev{p}, succ{s} { }
};
Run Code Online (Sandbox Code Playgroud)

我喜欢他的教学方法,从一个空壳开始,一路向上(他/他指的是本书的作者).因此,在他第一次尝试建立一个名单(挪威诸神)时,他这样做了:

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{"Freia",nullptr,norse_gods};
norse_gods–>succ–>prev = norse_gods;
Run Code Online (Sandbox Code Playgroud)

我的困惑在于他必须明确说明这一点:

norse_gods–>succ–>prev = norse_gods;
Run Code Online (Sandbox Code Playgroud)

如第三和第五行所示.

我在想添加项目而没有明确说明每次添加之间的代码行也会起作用.即:

Link* norse_gods = new Link{"Thor",nullptr,nullptr};
norse_gods = new Link{"Odin",nullptr,norse_gods};
norse_gods = new Link{"Freia",nullptr,norse_gods};
Run Code Online (Sandbox Code Playgroud)

我的思维状态是错误的吗?为什么必须将该行(norse_gods–>succ–>prev = norse_gods;)明确添加到代码中

Gar*_*rez 5

让我们说,A <--> BA->succ == BB->prev == A.在第1行之后你有:

norse_gods == Thor

在第2行之后你有:

norse_gods == Odin ---> Thor

这里的问题是,Odin->succ == Thor但是Thor->prev == nullptr.因为列表中的每个元素都有一个指向其前一个元素和后一个元素的指针,所以这是一个双向链接列表,旨在两个方向遍历,但是现在它只能遍历一个(从左到右).这可以通过制作来纠正Thor->prev == Odin.因为Odin->succ == Thornorse_gods == Odin我们可以访问和更改Thor->prev的行路norse_gods->succ->prev = norse_gods;.之后你有:

norse_gods == Odin <--> Thor