Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 无法使用临时指针设置值_C++_Pointers_Red Black Tree - Fatal编程技术网

C++ 无法使用临时指针设置值

C++ 无法使用临时指针设置值,c++,pointers,red-black-tree,C++,Pointers,Red Black Tree,这是我文件中的函数 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*

这是我文件中的函数

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);
}
struct节点{
int数据;
节点*prev=nullptr;
Node*leftChild=nullptr;
Node*rightChild=nullptr;
炭色;
};
中的void(节点*&根,常量int x){
Node*newNode=新节点;
newNode->data=x;
Node*ptr=root;
Node*setPrev=nullptr;
while(ptr!=nullptr){
不能离开孩子;
其他的
ptr=ptr->rightChild;
}
ptr=newNode;
ptr->prev=setPrev;
(ptr->prev==nullptr)?ptr->color='B':ptr->color='R';
如果(ptr->prev!=nullptr)
旋转轮毂(根部);
}
我已经减少了代码的#,所以rotationHub函数将不会被发布

这是主要的

intmain(){
Node*root=nullptr;
in(根,10);

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

void in(节点*&root,常量int x){
Node*ptr=root;//创建root当前值的独立副本
//…现有代码
//通过引用操作作为root提供的调用方变量
根=ptr;
}

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

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

void in(节点*&root,常量int x){
Node*ptr=root;//创建root当前值的独立副本
//…现有代码
//通过引用操作作为root提供的调用方变量
根=ptr;
}

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

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


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

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


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

正如我前面所说的,
ptr
的初始化复制
的值。变量
ptr
不引用任何内容

是这样的:

+------+ | root | --\ +------+ \ +-------------+ >--> | actual root | +------+ / +-------------+ | ptr | --/ +------+ +------+ +-------------+ | root | ----> | actual root | +------+ +-------------+ +------+ +-------------+ | ptr | ----> | newNode | +------+ +-------------+ 现在看起来是这样的:

+------+ | root | --\ +------+ \ +-------------+ >--> | actual root | +------+ / +-------------+ | ptr | --/ +------+ +------+ +-------------+ | root | ----> | actual root | +------+ +-------------+ +------+ +-------------+ | ptr | ----> | newNode | +------+ +-------------+ +------+ +-------------+ |根-->|实际根| +------+ +-------------+ +------+ +-------------+ |ptr--->|新节点| +------+ +-------------+
正如我之前所说的,
ptr
的初始化复制
root
值。变量
ptr
不引用任何内容

是这样的:

+------+ | root | --\ +------+ \ +-------------+ >--> | actual root | +------+ / +-------------+ | ptr | --/ +------+ +------+ +-------------+ | root | ----> | actual root | +------+ +-------------+ +------+ +-------------+ | ptr | ----> | newNode | +------+ +-------------+ 现在看起来是这样的:

+------+ | root | --\ +------+ \ +-------------+ >--> | actual root | +------+ / +-------------+ | ptr | --/ +------+ +------+ +-------------+ | root | ----> | actual root | +------+ +-------------+ +------+ +-------------+ | ptr | ----> | newNode | +------+ +-------------+ +------+ +-------------+ |根-->|实际根| +------+ +-------------+ +------+ +-------------+ |ptr--->|新节点| +------+ +-------------+
“从主屏幕打印”是什么意思?您可以包括创建问题的代码吗?
Node*ptr=root;
您复制了指针
root
。当
ptr
的生命周期结束时,任何分配给
ptr
的任务都将丢失。您从未设置
root
本身,它将保持为空指针。当您谈论中的错误时,这真是令人讨厌您不发布的代码。请始终将产生问题的代码包括在内。值得将其编辑到问题中,这样,如果我们运行它,我们可以重现问题,并验证我们是否已使用我们正在尝试的任何解决方案修复了它。此外,由于
ptr
是一个值,那么循环后的分配将不会将节点添加到树中,它将暗示覆盖当前值的
ptr
。循环根本不重要。我更喜欢编写这样的函数,其中新的根是返回值,如
root=in(…)
,这样就不会混淆指针的引用。你说的“从main打印它”是什么意思?您可以包括创建问题的代码吗?
Node*ptr=root;
您复制了指针
root
。当
ptr
的生命周期结束时,任何分配给
ptr
的任务都将丢失。您从未设置
root
本身,它将保持为空指针。当您谈论中的错误时,这真是令人讨厌您不发布的代码。请始终将产生问题的代码包括在内。值得将其编辑到问题中,这样,如果我们运行它,我们可以重现问题,并验证我们是否已使用我们正在尝试的任何解决方案修复了它。此外,由于
ptr
是一个值,那么循环后的分配将不会将节点添加到树中,它将暗示覆盖当前值的
ptr
。循环根本不重要。我更喜欢这样编写函数,其中新根是返回值,如
root=in(…)这样,指针的引用就没有问题了。也许他想要<代码>节点*& PTR = root;< /C> >忘记了密码。这样的小事情在C/C++中发生了很多。