c++ - 链表上的混淆

标签 c++ c++11 linked-list

我在c++编程原理与实践一书中阅读了这段代码。

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

我喜欢他从空壳开始逐步提升的教学方法(他/他是指本书的作者)。 因此,在他第一次尝试建立(北欧诸神)列表时,他这样做了:

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;

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

norse_gods–>succ–>prev = norse_gods;

如第三行和第五行所示。

我在考虑添加项目而不明确说明每次添加之间的代码行也可以。 即:

Link* norse_gods = new Link{"Thor",nullptr,nullptr};
norse_gods = new Link{"Odin",nullptr,norse_gods};
norse_gods = new Link{"Freia",nullptr,norse_gods};

是不是我的思维状态不对?为什么那行(norse_gods–>succ–>prev = norse_gods;)必须显式添加到代码中

最佳答案

假设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->prevnorse_gods->succ->prev = norse_gods;这行.之后你有:

norse_gods == Odin <--> Thor

关于c++ - 链表上的混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49118732/

相关文章:

c++ - C++ 中的绑定(bind)函数结果

c++ - std::poisson_distribution 中的 C++ 标准库中的错误?

c - & 和 * 运算符使我的 fread() 在 C 中成功

java - 在第一个位置插入元素时返回不正确的链接列表

c++ - 将字符串文字传递给模板字符数组参数

c++ - 如何创建一个宏来验证 HR 和日志?

c++ - 通过宏创建模板特化

c++ - 创建 shared_ptr 到堆栈对象

c++ - 连接元组作为类型

c - 排序链表时出现段错误