2015-10-13 70 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

謝謝,我會盡力的! –

相關問題