2016-06-26 9 views
1

私は、インサート関数を実装しようとしているバイナリ検索ツリーを持っています。しかし、私はコードをテストするとき、私のロジックが私にはうまくいくように見えますが、要素が全く追加されていないことがわかります。私はいくつかのCの体格が失われているように感じる。バイナリ検索ツリーが追加されない要素

struct tree_element { 
    int data; 
    struct tree_element* left; 
    struct tree_element* right; 
}; 

typedef struct tree_element node; 

void init(node* root){ 
    root->left = NULL; 
    root->right = NULL; 
    root->data = 0; 
} 

void insert(node* root, int val){ 
    if (root == NULL){ 
     root = (node*)(malloc(sizeof(node))); 
     init(root); 
     root->data = val; 
     printf("added %i\n", val); 
     return; 
    } 

    if (val > root->data){ 
     insert(root->right, val); 
    } 
    else { 
     insert(root->left, val); 
    } 
} 
+0

ダブルポインタ(ポインタへのポインタ)を使用する必要がありますが、実際には 'insert 'の結果としてノードを返す方が簡単です。 –

+0

ダブルポインタが必要なのはなぜですか?そして、現在のコードでは、ノードが追加されないようになっていますか? –

+0

[この問題の*多数*重複](https://stackoverflow.com/questions/6349196/binary-search-tree-pointer-problem)。 – WhozCraig

答えて

1

rootの値を変更します。 しかし、呼び出し関数の観点からは、何も変更されません。

これはうまくいくかもしれない:

void insert(node** root, int val){ 
    if (*root == NULL){ 
     *root = (node*)(malloc(sizeof(node))); 
     init(*root); 
     (*root)->data = val; 
     printf("added %i\n", val); 
     return; 
    } 
    if (val > (*root)->data){ 
     insert(&((*root)->right), val); 
    } 
    else { 
     insert(&((*root)->left), val); 
    } 
} 

基本的な概念である - あなたがメソッドへのポインタを渡したときに、この方法は、ポインタが指しているデータを変更することができますが、ポインタ自体を変更することはできません。

+0

機能的には同じですが(ノード**の代わりに 'node *&root'のように)ポインタの参照を使うのが簡単であるかもしれません。 –

+1

@ P.Kouvarakis少なくともCではありません。 – nbro

関連する問題