2017-04-18 6 views
0

정수 값을 포함하는 노드로 구성된 이진 트리와 노드의 왼쪽 및 오른쪽 분기에 대한 포인터.이진 트리의 루트에서 값을 인쇄하려고 할 때 크래시가 발생합니다.

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

typedef struct node{ 
    int val; 
    struct node *left; 
    struct node *right; 
} Node; 

void insert(Node *root, int val); 

int main(void){ 
    Node *root = NULL; 

    insert(root, 5); 
    insert(root, 3); 

    printf("%d\n", root->val); 


    return 0; 
} 

void insert(Node *root, int val){ 
    if(root == NULL){ // Create tree if root is empty 
     root = malloc(sizeof(struct node)); 
     root->val = val; 
     root->left = NULL; 
     root->right = NULL; 
    } else if(val < root->val){ // branch to left of tree if new value is less than root value 
     if(root->left == NULL){ 
      root->left = malloc(sizeof(struct node)); 
     } 

     root->left->val = val; 
    } else if(val > root->val){ // branch to right of tree if new value is greater than root value 
     if(root->right == NULL){ 
      root->right = malloc(sizeof(struct node)); 
     } 

     root->right->val = val; 
    } 
} 

어떤 이유로 든 삽입에 문제가 없습니다. 나는 5와 3을 모두 입력 할 수있다. 하지만 root -> val에 있어야하는 '5'값을 출력 할 수 없습니까? 프로그램이 완전히 충돌합니다. 나는 뭔가를 간과 했는가?

+2

첫 번째'insert()'다음에'root'의 포인터 값을 출력 해보십시오 - 여러분이 생각하는 것과 다릅니다 ... – John3136

+0

나는 멍청한 것처럼 보입니다. – Sato

+0

당신이 한 가지 방법은 연구를하지 않고 있었다. 그래서 링크 된 목록/나무 게시물의 절반 정도가이 '업데이트 만 로컬 바'문제가 있습니다. – ThingyWotsit

답변

1

문제는 insert의 서명에 : 그것은 함수 내에서 그에게 일어나는 변화를 다시 소통 할 수있는 방법이 없기 때문에 그것은 가능성의 root 매개 변수에 대한 NULL을받을 수 없어

void insert(Node *root, int val); 

. insert 내부의 root에 대한 수정 사항은 포인터가 값 (값 : )으로 전달 되었기 때문에 insert에 로컬로 남아 있습니다.

당신은 좋은 서명 일반적으로 두 가지 선택이 있습니다

  • 만들기가이 방법을 사용하는 경우 다음과 같이 발신자가 통화를해야합니다 즉, 새로운 rootNode *c을 반환 insert을 : root = insert(root, 5); 또는
  • Node* 대신 Node**을 전달하십시오. 즉, void insert(Node **root, int val);이 접근법을 사용하는 경우 호출자는 insert(&root, 5)과 같이 전화를 걸어야합니다. 물론 insert의 구현도 변경해야합니다. 추가 수준의 간접 지정을 수행하려면 추가 역 참조가 필요하기 때문입니다.
+0

감사합니다. 나는 그것이 보이는 범위와 기억을 닦을 필요가있다. – Sato

+0

나는 당신이 [가치에 의해 패스]에 브러시를해야한다고 생각 (http://stackoverflow.com/questions/373419/whats-the-difference-between-passing-by-reference-vs-passing-by-value); 스코프와 메모리는 직각으로 보입니다. – Sebivor