无法使用临时指针设置值

问题描述

这是我文件中的功能

struct Node{
    int data;
    Node* prev = nullptr; 
    Node* leftChild = nullptr;
    Node* rightChild = nullptr;
    char color;
};
void in(Node* &root,const int x){
    Node* newNode = new Node;
    newNode->data = x;
    Node* ptr = root;
    Node* setPrev = nullptr;
    while(ptr != nullptr){
        cout << "Did not skip" << endl;
        setPrev = ptr; 
        if(x < ptr->data)
            ptr = ptr->leftChild;
        else
            ptr = ptr->rightChild; 
    }

    ptr = newNode;
    ptr->prev = setPrev; 
    (ptr->prev == nullptr) ? ptr->color = 'B': ptr->color ='R';

    if(ptr->prev != nullptr)
        rotationHub(root);
}

我已经减少了代码数量,所以rotationHub函数不会一起发布。

这是main()

int main(){
  Node* root = nullptr;
  in(root,10);
  cout << "added" << endl;
  cout << root->data << Lendl;
  return 0;
}

问题是,我已经成功地在“函数”中添加了值 10。但是,如果我从 main.我将有 Segmentation fault11: 这是根 -> 数据为 nullptr;

好吧,如果我的 void in 函数没有 &root 那么即使我在 in 函数中设置了 Node* ptr = root 也没有修改 root 是有道理的。

所以就我而言,我不知道为什么我不能将根更改为 10。

解决方法

快速而丑陋的解决方法是正确操作 root 指针引用:

void in(Node* &root,const int x){
  Node* ptr = root; // Makes an independent copy of the current value of root

  // ... Existing code

  // Manipulate the caller's variable supplied as root via reference
  root = ptr;
}

如果您在调试器中逐步执行此代码,您可以看到 main() 变量 root 在该表单中的 in() 内没有改变。您正在使用它的另一个版本 ptr,它不是引用,而是一个自变量。

,

就像我之前说的,ptr 的初始化复制了root。变量 ptr引用任何东西。

是这样的:

+------+
| root | --\
+------+    \     +-------------+
             >--> | actual root |
+------+    /     +-------------+
| ptr  | --/
+------+

您有两个不同的变量,rootptr,它们指向同一位置。

然后你做作业

ptr = newNode;

现在看起来像这样:

+------+       +-------------+
| root | ----> | actual root |
+------+       +-------------+

+------+       +-------------+
| ptr  | ----> | newNode     |
+------+       +-------------+
,

首先,您找到在树中插入新节点的位置,然后指向新对象 (ptr = newNode;),而不是插入元素。相反,您希望 setPrev 通过左子节点或右子节点指向新节点。当 root 为 null 时,您需要单独的代码,这就是将指针的引用传递给函数的原因。

这是一个很好的练习,但在生产代码中,使用 std::set 或 std::map。