2015-10-13 45 views
-3

我正在构建一个AVL树程序。我陷入了一个相当容易的境地,但很难理解什么是错的。我认为这是该程序的错误,而不是我的原因是因为我有相同的类功能之前,它与“左”和“右”交换,它工作得很好...成员函数返回变量的前一个值

正如你所看到的,该函数返回temproot指针,该指针等于temp2,如果root==temp。有趣的是,虽然当我测试打印temproot JUST之前,它的价值(在我的例子中是15),返回的实际值是STILL 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; 
} 
+0

如果你说的是真的,它可能是缓冲区溢出(内存损坏)问题。 – SergeyA

+0

你如何存储函数的返回值? – NathanOliver

+1

我不相信你。你是如何“检查”这些东西的? 'temproot = temp2;'真的被执行了吗? –

回答

0

我没有看到你所看到的功能的问题。

指针的工作方式不同于典型的对象(值),如果没有绘图板,很难解释,但让我试试。当您“记住”最初传入节点的指针时,您只记得那一点。即使您将初始指针分配给不同的结构字段,“移动它”,您的“副本”仍将指向完全相同的元素,因为当您分配/重新分配指针时,实际内存不会移动。而且,因为(就你的情况而言),你正在做的旋转不会被父元素反射,最初传入的根元素将会反映它,因为它仍然指向分配给temp2- >左(如temproot,因为实际内存不重新分配)。

如果您想更改(有权访问)存储实际元素的位置。正如我假设你的情况,你需要通过引用(avlnode * Tree :: RL_rotation(avlnode * & temp))传递旋转的根元素。通过这样做,你将会传递函数,不仅包含你想要做旋转的节点的内存位置,还包括位置的位置。在旋转之后,这将允许更改根目录,之前您无法执行此操作。

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

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

而是,像这样写(因为你不需要创建新节点 - 你只是重新排列它们): avlnode * temp1 = temp-> right;

+0

谢谢,我会尽力的! –

相关问题