2011-06-14 7 views
2

C를 (다시) 배우기 위해 이진 검색 트리를 구현하려고했습니다. 문제는이 current = new;이 tree.root가 여전히 null 포인터이므로 원하는대로 작동하지 않는다는 것입니다. 두 개의 노드를 추가합니다. 그게 뭐가 잘못 됐니?이진 검색 트리 포인터 문제

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


typedef struct BinaryNode { 
    int key; 
    double value; 
    struct BinaryNode *left; 
    struct BinaryNode *right; 
    } BinaryNode; 

typedef struct BinaryTree { 
    struct BinaryNode *root; 
    } BinaryTree; 


static void binary_tree_insert_recursive(BinaryNode *current, BinaryNode *new) { 
    if (current == NULL || current->key == new->key) { 
     current = new; 
    } else if (current->key > new->key) { 
     binary_tree_insert_recursive(current->left, new); 
    } else if (current->key < new->key) { 
     binary_tree_insert_recursive(current->right, new); 
    } 
} 

void binary_tree_insert(BinaryTree *tree, int key, double value) { 
    BinaryNode *new = (BinaryNode *) malloc(sizeof(BinaryNode)); 
    new->key = key; 
    new->value = value; 
    binary_tree_insert_recursive(tree->root, new); 
} 

int main(void) { 
    BinaryTree tree; 
    binary_tree_insert(&tree, 5, 123); 
    binary_tree_insert(&tree, 10, 123); 
    printf("%p\n", tree.root); 
    return 0; 
} 

고마워요!

답변

1

current = new;의 문제점은 current의 로컬 복사본을 변경하고 있다는 것입니다. 기능이 완료되면이 수정 내용을 볼 수 없습니다.

static void binary_tree_insert_recursive(BinaryNode **current, BinaryNode **new) 
{ 
    if (*current == NULL || (*current)->key == (*new)->key) { 
    *current = *new; 
    /* ... */ 

음이 C FAQ 설명 :

난 당신이 뭔가를 할 생각한다.

+0

흠, 이중 포인터가 필요합니다. 고맙습니다! –

+0

@ahojnnes : 작성한 모든 노드에 대해 "왼쪽"및 "오른쪽"포인터를 NULL로 초기화하는 것을 고려해야 할 수도 있습니다. 또한 변수 이름을 "new"로 지정하지 마십시오. 혼란 스럽습니다. – Andrei

+0

@Andrei : 기본적으로 널 포인터로 초기화되지 않습니까? –

0

new은 (는) 키워드입니다. 다른 변수 이름을 선택하십시오.

+2

적절한 그렇지 않은 : 당신은 당신이 변경하려는 포인터의 주소을하는 기능을 수정해야합니다. 그러나 OP 컴파일 링이 어떤 것인지 누가 알 수 있습니까? 컴파일러 또는 오류 메시지를 지정하지 않았습니다. –

+0

이 C++ 생각 했나요? 그럼에도 불구하고 문제를 해결하지는 못합니다. –

0

그 모두 current = newcurrentnew을 가리키고있는 것을 가리키고 있습니다. 복사가 일어나지 않으며이 기능은 해당 코드 패스에 영향을 미치지 않습니다.

1

current은 노드에 대한 포인터입니다. binary_tree_insert_recursivebinary_tree_insert에서 전달하면 포인터가 전달됩니다. 따라서 호출 된 함수 내에서 변경 되더라도 변경 내용은 호출 함수에 반영되지 않습니다. C에서

static void binary_tree_insert_recursive(BinaryNode **current, BinaryNode *new) 
{ 
     if (*current == NULL || (*current)->key == new->key) { 
      *current = new; 
+0

도 정답, 감사합니다! –