2011-09-28 80 views
4

我在構建二叉樹時遇到了一個相當混亂的問題。顯然這應該是一個簡單的任務,但不知何故,我可能會搞砸它的指針。二叉搜索樹不起作用

下面是簡化的代碼(當然這不是真正的代碼):

#include <string.h> 
#include <iostream> 

using namespace std; 

#define DIM1 2 

typedef enum {LEFT,RIGHT} direction; 
typedef char tName[MAX_NAME_LEN + 1]; 

struct Rectangle { 
    tName _name; 
    struct Rectangle *_binSon[DIM1];    
}; 

struct Rectangle *recTree; 

void insertRectToTree(char str[]){ 
    struct Rectangle rect; 
    struct Rectangle *point; 
    struct Rectangle *parent; 
    strcpy(rect._name,str); 
    rect._binSon[RIGHT] = NULL; 
    rect._binSon[LEFT] = NULL; 
    point = &rect; 
    if (recTree == NULL){ 
     recTree = point; 
    } else { 
     struct Rectangle *current; 
     current = recTree; 
     while (current){ 
      parent = current; 
      if (strcmp(point -> _name, current -> _name) > 0){ 
       current = current -> _binSon[RIGHT]; 
      } else { 
       current = current -> _binSon[LEFT]; 
      } 
     } 
     if (strcmp(point -> _name, parent -> _name) < 0){ 
      parent -> _binSon[LEFT] = point; 
     } else { 
      parent -> _binSon[RIGHT] = point; 
     } 
     } 
    } 

int main(){ 
    recTree = NULL; 
    char str[] = "LIKE"; 
    insertRectToTree(str); 
    char str2[] = "GUIDE"; 
    insertRectToTree(str2); 
    printf(recTree -> _name); 
    return 0; 
} 

正如你所看到的,這個二叉樹嘗試基於它的名字來組織的記錄,所以最小的字母順序將去到左側等等。

問題是,在第一次插入「LIKE」之後,我想把「GUIDE」插入到樹中,並且仍然以「LIKE」作爲根。但是,printf()顯示「GUIDE」作爲其根。 (換句話說,「GUIDE」是輸出)。對此有什麼好的解釋?問我是否需要爲這個問題添加更多的東西。感謝您所有的幫助。

+0

是語言C++或C? –

+0

這是C++,但我敢打賭,它適用於C以及因爲我不使用任何類 – vandershraaf

+0

爲什麼你把關鍵字結構放在這一行「struct Rectangle * current;」 –

回答

4

在以下行

struct Rectangle rect; 
... 
point = &rect; 
... 
recTree = point; 

分配給一個局部變量的引用,一個全球性的指針。離開函數後,它可能不再包含有效數據。

+0

這是真的。你有什麼解決方法嗎?我有點老實地指着指針 – vandershraaf

+0

@vandershraaf使用'point = new struct Rectangle;'以後'point - > _binSon [RIGHT] = NULL; ...'完全擺脫'rect'。 – Howard

+0

我沒有使用[new struct Rectangle],而是使用[new Rectangle]。順便說一句,謝謝你的迴應。這是最好的答案,因爲我不知道 – vandershraaf

1

霍華德是正確的。但要糾正這個問題,請使用新的。

的即代替 point = &rect;

point = new struct Rectangle;

+0

之前的真正問題,我試過這個,但它有錯誤。有沒有其他的解決方法? – vandershraaf

+0

我試過這個,但[point = new Rectangle]效果更好。儘管如此,我爲你的見解付出了努力 – vandershraaf