成员访问双向链接列表

时间:2017-06-16 13:05:11

标签: c++ pointers doubly-linked-list

我目前在使用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;


}

1 个答案:

答案 0 :(得分:2)

此:

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

创建了一个具有NULL后继和前任的节点。现在我们在开头附加第二个节点:

norse_gods =       new Link{ "Odin", nullptr, norse_gods };

请注意,norse_gods中的上一个节点Thor附加为后继节点。所以我们现在有了

Odin -> Thor

但Thor的前任指针仍为NULL!我们没碰到它!但我们现在知道它是奥丁。因此,让我们将其修复为指向Odin,norse_gods目前指出了这一点:

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,应该是。