C++ 成员函数返回变量的上一个值

C++ 成员函数返回变量的上一个值,c++,avl-tree,C++,Avl Tree,我正在构建一个AVL树程序。我陷入了一个相当容易的境地,但很难理解到底出了什么问题。我之所以认为这是程序的错误而不是我的错误,是因为我在它前面有一个完全相同的类函数,它的“左”和“右”被交换了,并且工作得很好 如您所见,该函数返回temproot指针,如果root==temp,则该指针等于temp2。有趣的是,虽然在返回值之前测试打印temproot的值(在我的示例中是15),但返回的实际值仍然是20(之前的temproot)。我把所有的东西都检查了三遍。它似乎没有返回新获得的值。。。有什么问题

我正在构建一个AVL树程序。我陷入了一个相当容易的境地,但很难理解到底出了什么问题。我之所以认为这是程序的错误而不是我的错误,是因为我在它前面有一个完全相同的类函数,它的“左”和“右”被交换了,并且工作得很好

如您所见,该函数返回
temproot
指针,如果
root==temp
,则该指针等于
temp2
。有趣的是,虽然在返回值之前测试打印
temproot
的值(在我的示例中是15),但返回的实际值仍然是20(之前的
temproot
)。我把所有的东西都检查了三遍。它似乎没有返回新获得的值。。。有什么问题吗

更具体地说,确切的代码如下:

//structure
struct avlnode
{
    int data;
    avlnode * left;
    avlnode * right;
}* root;

//class function
avlnode * Tree::RL_rotation (avlnode * temp)
{
    avlnode * temproot = temp;
    avlnode * temp1= new avlnode;
    temp1=temp->right;
    avlnode * temp2= new avlnode;
    temp2=temp1->left;

    temp1->left=temp2->right;
    temp2->right=temp1;
    temp->right=temp2;

    temp->right=temp2->left;
    temp2->left=temp;

    if (root==temp)
    {
        root=temp2;
        temproot=temp2;
    }
    cout << "temproot= " << temproot->data << endl;
    return temproot;
}
//结构
结构avlnode
{
int数据;
avlnode*左;
avlnode*右;
}*根;
//类函数
avlnode*树::RL_旋转(avlnode*temp)
{
avlnode*temproot=temp;
avlnode*temp1=新的avlnode;
temp1=temp->right;
avlnode*temp2=新的avlnode;
temp2=temp1->left;
temp1->left=temp2->right;
temp2->right=temp1;
temp->right=temp2;
临时->右=临时2->左;
temp2->left=temp;
如果(根==temp)
{
根=temp2;
temproot=temp2;
}

cout我认为您看到的功能没有问题

指针的工作方式与典型对象(值)不同,如果手头没有绘图板,很难解释,但让我试试

当您“记住”最初传入节点的指针时,您只记住了这一点。即使您将初始指针分配给不同的结构字段,“四处移动”,您的“副本”仍将指向完全相同的元素,因为在分配/重新分配指针时,实际内存不会移动。因此(在您的例子中),您正在进行的旋转不会由最初传入根的父元素反映,因为它仍然指向分配给temp2->left的同一元素(与temproot一样,因为实际内存没有重新分配)

如果您想更改(有权访问)实际元素的存储位置。正如我假设的那样,您需要通过引用传入旋转的根元素(avlnode*Tree::RL_rotation(avlnode*&temp))。通过这样做,您将向函数传递的不仅是节点的内存位置,您希望围绕该位置进行旋转,还将传递该位置的位置。这将允许在旋转后更改根,这是您以前无法执行的

注意:摆脱这样的代码: avlnode*temp1=新的avlnode; temp1=temp->right

您正在创建一个新的内存位置,您会立即忘记它,并且它永远不会被释放(本机C++中没有垃圾收集器)

相反,可以这样写(因为您实际上不需要创建新节点-您只需要重新排列它们):
avlnode*temp1=temp->right;

如果你说的是真的,那可能是缓冲区溢出(内存损坏)问题。我不相信你。你是如何“检查”这些东西的?是否真的执行了
temproot=temp2;
呢?不相关代码可能并没有那么不相关…问题不在发布的代码中。您正在分配新的节点,您会立即泄漏这些节点。谢谢,我会尝试的!