2016-05-23 61 views
0

我在這兩種結構:傳遞一個新節點的指針結構內

typedef struct node { 
    int info; 
    struct node *left, *right; 
}NODE; 

typedef struct bst { 
    NODE *root; 
}BST; 

而這些功能:

NODE *newNode(int info) { 
    NODE *tmp = (NODE *)malloc(sizeof(NODE)); 
    tmp->left = tmp->right = NULL; 
    tmp->info = info; 
    return tmp; 
} 
void addTree(BST **bst, int info) { 
    if (*bst == NULL) { 
     (*bst)->root = newNode(info); // <- Breaks the program 
     return; 
    } 
    else while ((*bst)->root != NULL) { 
     if (info < (*bst)->root->info) 
      (*bst)->root = (*bst)->root->left; 
     if (info >(*bst)->root->info) 
      (*bst)->root = (*bst)->root->right; 
    } 
    (*bst)->root->info = info; // <- Breaks the program 
} 

我想不出有什麼我已經做錯了。 我打電話這樣的功能的主要功能:

addTree(&binST, tmp); 

我用調試器,它給了我不是一個單一的錯誤或警告。 任何幫助,將不勝感激。

+0

' - >'也是一個解引用運算符,並且不能解引用NULL。 – jxh

回答

1
if (*bst == NULL) { 
    (*bst)->root = newNode(info); // <- Breaks the program 

Excatly問題就出在這裏,因爲*bstNULL然後在下一行你取消對它的引用(當你試圖訪問結構成員),這將導致未定義行爲和崩潰,你的情況。

在訪問結構成員之前,您需要分配內存到*bst。這樣的 -

if (*bst == NULL) { 
    *bst=malloc(sizeof(BST));  //allocate memory first and then access struct members 
    (*bst)->root = newNode(info); 

注意 - 請記住,free分配的內存。

+0

這是問題..很多謝謝。 P.S.我已經在主函數中分配內存將工作正常嗎? –

+0

@DraganZrilić我想這對root很好,但當你使用遞歸,所以對於其他節點你需要在這個函數中分配內存,否則會出現同樣的問題。 – ameyCU