2015-05-22 83 views
0

我創建了兩個結構尖銳的數據不斷消失

typedef struct node 
{ 
    struct node* left; 
    struct node* right; 
    int data; 
} node; 

typedef struct head 
{ 
    int count; 
    struct node* root; 
} head; 

,這裏是我試圖使用將數據插入到一棵樹的功能之外吧。

int insert(struct node* root, int value) 
{ 
    node* newnode =(node*)malloc(sizeof(node)); 
    newnode->data=value; 
    newnode->left=NULL; 
    newnode->right=NULL; 
    if(root==NULL) 
    { 
     root=newnode; 
     return 1; 
    } 
    if(value<root->data) 
    { 
     if(root->left==NULL) 
     { 
      root->left=newnode; 
      return 1; 
     } 
     else 
     { 
      return insert(root->left,value); 
     } 
    } 
    else if(value==root->data) 
    { 
     printf("data already exist\n"); 
     free(newnode); 
     return 0; 
    } 
    else 
    { 
     if(root->right==NULL) 
     { 
      root->right=newnode; 
      return 1; 
     } 
     else 
     { 
      return insert(root->right,value); 
     } 
    } 
} 

,當我操作

head* BSThead=(head*)malloc(sizeof(head)); 
insert(BSThead->root,10); 

我可以看到,插入功能成功地進入第一和如果操作線根= newnode,和我可以看到,它已給出的地址。

但是當這個函數結束時,我回到主函數來通過 來訪問它printf(「%d」,BSThead-> root);

這行只是打印0,我認爲這意味着BST-> root目前爲空。

據我所知,由malloc函數創建的數據具有與正常值不同的功能範圍。所以我認爲雖然newnode是在插入函數中創建的,但是在插入函數結束時不會像正常變量一樣被銷燬,因此我可以在程序運行時隨時使用它。

+1

你可能需要傳遞指向該函數根節點指針的指針。或者你可以從函數返回新的根節點指針。對於具有相同基本診斷的SO,存在很多問題。但是,您還會將未經檢查的未初始化數據從'malloc()'傳遞給函數,這也可能導致很多麻煩。 –

回答

2

這些行:

if(root==NULL) 
{ 
    root=newnode; 
    return 1; 
} 

修改功能root,但不調用函數改變同一變量的值。

調用函數中的root的值繼續爲NULL,並且您將由調用分配的每個節點泄漏到malloc

解決此問題的一種方法是將指針傳遞給root

int insert(struct node** root, int value) 
{ 
    ... 
    if(*root==NULL) 
    { 
     *root=newnode; 
     return 1; 
    } 

    ... 
} 

,並呼籲使用功能:

insert(&(BSThead->root),10); 
1

的一個問題是,你正在使用:

head* BSThead = (head*)malloc(sizeof(head)); 
insert(BSThead->root, 10); 

這傳遞一個未經檢查的指針未初始化的數據的功能。只有在你不幸的時候,它纔會成爲你傳遞的空指針。該函數無法修改BSThead->root中的值,因爲您正在傳遞其值,而不是指向它的指針。您還沒有通過整個head結構,因此insert()代碼無法更新計數。

你需要在使用它之前初始化你的頭部結構。當你使用它,你需要或者指針傳遞給頭結構到功能,或者您需要的root成員的地址傳遞給函數,這樣函數可以更新:

head* BSThead = (head*)malloc(sizeof(head)); 
if (BSThead != 0) 
{ 
    BSThead->count = 0; 
    BSThead->root = 0; 
    /* Either */ 
    insert(BSThead, 10);   // And insert can update the count 
    /* Or */ 
    insert(&BSThead->root, 10); // But insert can't update the count! 
    …use the list… 
    …free the list… 
}