我在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 <--> B
说A->succ == B
和 B->prev == A
.在第 1 行之后,您有:
norse_gods == Thor
在第 2 行之后你有:
norse_gods == Odin ---> Thor
这里的问题是 Odin->succ == Thor
但是Thor->prev == nullptr
.因为列表中的每个元素都有一个指向其前一个和后继元素的指针,所以这是一个双向链表,旨在双向遍历,但现在它只能在一个方向(从左到右)遍历。这是通过制作 Thor->prev == Odin
来纠正的.自 Odin->succ == Thor
和 norse_gods == Odin
我们可以访问和更改 Thor->prev
在norse_gods->succ->prev = norse_gods;
这行.之后你有:
norse_gods == Odin <--> Thor
关于c++ - 链表上的混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49118732/