2016-12-11 69 views
0

以下是我爲BST插入函數編寫的代碼。有人可以解釋爲什麼這給出了分段錯誤?在BST插入中使用**()

#include <stdio.h> 
#include <stdlib.h> 

struct node{ 
    int value; 
    struct node* right; 
    struct node* left; 
}; 

struct node* insert(struct node* n,int age){ 
    if (n==NULL){ 
     n = malloc(sizeof(struct node)); 
     n->value = age; 
     n->left = n->right = NULL; 
    } 
    else if(age < n->value){ 
     n->left = insert(n->left, age); 
    } 
    else { 
     n->right = insert(n->right, age); 
    } 
    return n; 
} 

void main(){ 
    int age; 
    struct node* n=NULL; 
    scanf("%d",&age); 
    while (age!=-1){ 
     n=insert(n,age);  
     scanf("%d",&age); 
    } 
} 

我稱爲this和它建議使用的**(參照指針)。

f(&px); 
//... 

void f(int **px) 
{ 
    *px = malloc(sizeof(int)); 

    printf("*px = %p\n", *px); 
} 

但爲什麼我們不能避免使用**通過改變從voidnode*返回類型?

+0

'insert'老是死機。你的編譯器不會爲此提出警告嗎? – melpomene

+1

'main'應該返回'int',而不是'void'。 – melpomene

+0

你缺少'#include '和'#include '。 – melpomene

回答

0

這似乎適用於我。除了您使用scanf()的方式以外,我沒有太多的改變或者您的代碼,當您輸入1時,這並不會結束。

這是更好地只是調用scanf一次,並確保你可以連續輸入,使用while (scanf(.....) == 1,以確保一個值總是讀直至終止,在此情況下,直到age1

除非我失去了一些東西,這是推薦碼:

#include <stdio.h> 
#include <stdlib.h> 

struct node{ 
    int value; 
    struct node* right; 
    struct node* left; 
}; 

struct node* insert(struct node* n,int age){ 
    if (n==NULL){ 
     n = malloc(sizeof(struct node)); 
     n->value = age; 
     n->left = n->right = NULL; 
    } 
    else if(age < n->value){ 
     n->left = insert(n->left, age); 
    } 
    else { 
     n->right = insert(n->right, age); 
    } 
    return n; 
} 

void 
print_tree(struct node *n) { 
    if (n != NULL) { 
     print_tree(n->left); 
     printf("%d\n", n->value); 
     print_tree(n->right); 
    } 
} 

int main(){ 
    int age; 
    struct node* n = NULL; 

    printf("Enter some numbers(1 to stop): "); 
    while (scanf("%d", &age) == 1 && age != 1) { 
     n = insert(n, age); 
    } 

    printf("\nYour numbers inserted into BST:\n"); 
    print_tree(n); 

    return 0; 
} 
+0

我只是將我的'void main()'改爲'int main()',它可以工作。謝謝!但是我不明白爲什麼'void'不起作用。 –

+1

此答案似乎無法解決任何段錯誤。就目前來看,問題中的代碼似乎是正確的。按照@RoadRunner的建議使用'scanf'是一個好主意,但不是必要的。 – nickie

+0

@nickie真的,我希望它能幫助OP。 – RoadRunner