2016-12-11 2 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); 
} 

그러나 우리는 void에서 node*에 반환 형식을 변경하여 사용 **을 피할 수없는 이유는 무엇입니까?

+0

'insert' 항상 충돌 :

내가 뭔가를 놓친 거지하지 않는 한,이 제안 된 코드입니다. 컴파일러가 이것을 경고하지 않습니까? – melpomene

+1

'main'은'void'가 아니라'int'를 리턴해야합니다. – melpomene

+0

'#include '과'#include '가 없습니다. – melpomene

답변

0

이것은 나를 위해 작동하는 것 같습니다. scanf()을 사용하는 방법을 제외하고는 코드를 많이 변경하지 않았으며 1을 입력하면 끝나지 않습니다.

age1 때까지 그냥 종료 될 때까지이 경우, 하나 개의 값이 항상 읽어되어 있는지 확인하기 위해, while (scanf(.....) == 1를 사용하여 한 번 scanf를 호출하고 연속 입력을 할 수 있는지 확인하는 것이 좋습니다.

#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

이 답변은 segfault를 수정하지 못하는 것 같습니다. 문제의 코드는 현재 그대로 서있는 것처럼 보입니다. @RoadRunner가 제안하는 방식으로'scanf'를 사용하는 것은 좋은 생각이지만 필요하지는 않습니다. – nickie

+0

@nickie True 사실, 그것이 OP를 도왔 으면 좋겠다. – RoadRunner