我目前在《编程:使用C++的原理和实践》的第17章,我无法弄清楚。在下面的代码中,该行是什么norse_gods->succ->prev = norse_gods
实际做什么?我知道->是成员访问运算符,给出了指向对象的指针。这是否意味着我要访问norse_gods后继产品的前身?我对此感到困惑。这只是第一部分,随后在书中定义了插入操作,该操作使用相同的符号,因此我想确切地知道它的含义。感谢您的时间。
这是代码:
struct Link {
string value;
Link* prev;
Link* succ;
Link(const string& v, Link* p = nullptr, Link* s = nullptr)
: value(v), prev(p), succ(s) {}
};
//insert n before p (incomplete)
Link* insert(Link* p, Link*n)
{
n->succ = p;
p->prev->succ = n;
n->prev = p->prev;
p->prev = n;
return n;
}
int main()
{
//Building a list of Norse gods
// val prev suc
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;
}
最佳答案
这个:
Link* norse_gods = new Link{ "Thor", nullptr, nullptr };
创建一个具有NULL后继和前任的节点。现在我们在开始处附加第二个节点:
norse_gods = new Link{ "Odin", nullptr, norse_gods };
注意
norse_gods
中的上一个节点Thor是作为后继节点附加的。所以现在我们有了Odin -> Thor
但是Thor的前任指针仍然是NULL!我们没有碰它!但是我们现在知道是奥丁。因此,让我们将其修复为指向
norse_gods
当前指向的Odin:norse_gods->successor /*Translates to Odin's successor, which is Thor*/ ->predecessor /*This is still null from the first line*/ = /*So fix it to point to the current norse_gods, Odin*/ = norse_gods /*pointing to Odin*/
因此,现在链接已固定,Thor的前任是应该的Odin。