2016-12-11 42 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