【问题标题】:Deleting a node and dealing with the new nullptr and linked node [closed]删除节点并处理新的 nullptr 和链接节点 [关闭]
【发布时间】:2017-10-16 09:16:31
【问题描述】:

所以我有一个带有根节点的队列。每个节点都有一个子节点或兄弟节点。根可以有多个子节点,但只能指向一个 child 节点。那个孩子可以有孩子,但也会有其他兄弟姐妹。这些兄弟姐妹都是根节点的孩子。最后一个没有兄弟姐妹的孩子,我们称其父节点为兄弟节点,因此称为根。

我遇到的问题是当我想删除父节点时。我必须遍历孩子,直到没有孩子为止。如果我这样做 if(currNode->sibling),这适用于所有儿童。但如果兄弟姐妹是根,我不应该认为它应该打破 if 语句。因为在执行此循环之前,我确实删除了 root。然后root = nullptr。那么为什么以兄弟为根的孩子仍然指向一个有效的位置而不是 nullptr 呢?非常感谢

【问题讨论】:

  • 请出示代码,这样会容易很多。可能你没有在堆中创建变量(使用新关键字)..
  • 指针是一种方式。 A指向B。B不知道它被指向。想一想,必须跟踪所有指向变量的潜在指针将是一场噩梦。呸。无论如何,root 指向一个节点。删除此节点并将 root 置空也不能将同级指向 roots 节点的指针置空。因为root 不知道还有谁在指向同一个节点。
  • 啊,我明白了!这很令人困惑。所以我考虑到了这一点,最初并没有删除root。我刚刚检查了兄弟姐妹!= root。这个条件很容易满足,而且看起来更合适。感谢您的帮助!
  • 也许你可以尝试指向指针(**)的指针。 currNode->sibling = &root;如果 root 为 nullptr,*currNode->sibling 也将为 nullptr。
  • @user2971569 谢谢,我会试试看会发生什么。

标签: c++ queue nodes pairing


【解决方案1】:

在纸上画出来。父节点不能是其自己子节点的兄弟节点。因此,您所说的“最后一个没有兄弟姐妹的孩子,我们称父节点为兄弟节点,因此根节点”是完全错误的。如果您实际上正在这样做,请停止这样做。最后一个节点后面没有兄弟节点,下面也没有子节点。

当移除一个节点时,循环它的兄弟节点是错误的。您必须循环遍历它的 children,并且只有 update 它的直接兄弟姐妹才能相互指向,因为在移除完成后它们现在将成为新的兄弟姐妹。 p>

试试这样的:

struct node
{
    node *parent;
    node *children;
    node *previous;
    node *next;
    ...

    node() :
        parent(0), children(0), previous(0), next(0), ...
    {}

    ~node()
    {
        unlink();
        while (children)
            delete children;
    }

    void unlink()
    {
        if (previous)
            previous->next = next;

        if (next)
            next->previous = previous;

        if ((parent) && (parent->children == this))
            parent->children = next;

        parent = next = previous = 0;
    }

    void addChild(node *child)
    {   
        child->unlink();

        child->parent = this;
        if (children)
        {
             node *t = children;
             while (t->next)
                 t = t->next;
             child->previous = t;
             t->next = child;
        }
        else
            children = child;        
    }

    ...
};

class myqueue
{
private;
    node *root;
    ...

public:
    myqueue() :
        root(new node)
    {}

    ~myqueue()
    {
        delete root;
    }

    void addChild(node *parent = 0)
    {
        node n = new node;

        if (!parent)
             parent = root;

        parent->addChild(node);
    }

    void remove(node *n)
    {
        delete n;
    }

    ...
};

【讨论】:

    猜你喜欢
    • 2021-07-01
    • 2017-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多