【问题标题】:Pointer to pointer for struct in C++指向 C++ 中结构指针的指针
【发布时间】:2021-07-14 16:53:07
【问题描述】:

我正在尝试解决 GFG 上的问题Populate Inorder Successor for all nodes in a BST。 给出了一些代码(无法粘贴到这里,因为这里显示了很多代码)

我需要对populateNext(node* p) 进行编码,其中 p 是树的根节点。 我对函数进行了如下编码,但它不工作并且输出为3->-1 而不是3->8 8->10 10->12 12->-1

void populateNext(struct node* p)
{
    static node* x=NULL;
    if(p==NULL) return;
    populateNext(p->right);
    p->next=x;
    x=p;\
    populateNext(p->left);
}

我认为创建的x 节点永远不会被修改,因此主函数ptr 中的指针不会向前移动。然后我寻找更多的解决方案,并找到了一个类似的带有双指针的解决方案。我不知道为什么我的不工作,但下面的工作。

void find(struct node* root,struct node **nextr)
{
    if(root)
    {
        find(root->right,nextr);
        
        root->next = *nextr;
        
        *nextr = root;
        
        find(root->left,nextr);
    }
}
void populateNext(struct node* p)
{
   struct node* next = NULL;
   find(p,&next);
}

我知道指针 x 正在存储结构变量的地址,并且每次调用函数时,我都会为我的指针分配一个新的节点指针,因此它应该可以工作。我尝试将节点 x 也声明为全局但仍然是相同的答案 3->-1

我尝试搜索指向结构指针的指针,但到处都只给出了如何做到这一点。我想问为什么代码不适用于单指针,为什么它适用于指针指针以及指针指针的用途,即我们为什么使用 is?单指针有什么限制?

【问题讨论】:

    标签: c++ pointers struct


    【解决方案1】:

    比双指针更好的名称是指向指针的指针。这意味着,您正在分配 4 个字节(在 32 位系统中)来保存某物的地址。它是什么取决于程序员。如果您使用指向指针的指针,您将持有其他地址的地址,该地址可能持有其他地址(如此结构)。可以任意组合。

    在第一次尝试中,每个递归调用都有它自己的x 变量——这是错误的。该算法需要公共nextr 变量,该变量只分配一次,并在每个递归级别上使用。这就是您的程序开始工作的原因。

    第二次尝试在堆栈上分配next 地址,初始化为NULL。这个地址被传递给递归的find 函数(&next),它又知道它是什么,并写入它(*nextr = root)。此写入是在 populateNext 的堆栈分配的 next 变量上进行的,就像在每个 find 调用中一样。

    【讨论】:

    • "每个递归调用都有自己的 x 变量是错误的,因为我将 x 设为静态
    • @RitikaGupta 正确,请检查 static struct node* x=NULL; 而不是 static node* x=NULL;
    • 还是同样的问题
    • @RitikaGupta 我鼓励你使用像gdb 这样的调试器或者它的视觉覆盖来检查问题所在。特别是检查x 变量内容和每个递归级别的地址是否相同。接下来是关注x 的更改,并将它们与第二个解决方案进行比较。
    • 我也会尝试。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-04
    • 2016-08-25
    • 1970-01-01
    • 2016-03-21
    • 2012-03-28
    相关资源
    最近更新 更多