我阅读了使用 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} { }
};

我喜欢他的教学方法,从空 shell 开始,然后一路向上(他/他是指这本书的作者)。
因此,在他第一次尝试建立(北欧诸神)列表时,他这样做了:
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;

如第三行和第五行所示。

我正在考虑添加项目而没有明确说明每个添加之间的代码行也可以工作。
IE:
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 <--> B 表示 A->succ == BB->prev == A 。在第 1 行之后,您有:
norse_gods == Thor
在第 2 行之后,您有:
norse_gods == Odin ---> Thor
这里的问题是 Odin->succ == ThorThor->prev == nullptr 。因为列表中的每个元素都有一个指向其前一个和后继元素的指针,这是一个双向链表,旨在双向遍历,但现在只能在一个方向(从左到右)遍历。这可以通过制作 Thor->prev == Odin 来纠正。由于 Odin->succ == Thornorse_gods == Odin 我们可以在 Thor->prev 行中以这种方式访问​​和更改 norse_gods->succ->prev = norse_gods; 。之后你有:
norse_gods == Odin <--> Thor

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

10-11 19:34