2017-03-14 10 views
0

Cでのバイナリ検索ツリー:メインでセグメンテーションフォールト、私はこの機能を使ってツリーにデータを挿入したい

struct treeNode{ 
    data* val; 
    struct treeNode *left, *right, *parent; 
}; 


void insert(data *d, struct treeNode **leaf, struct treeNode **leaf_par) 
{ 
    if(*leaf == 0) 
    { 
     *leaf = (struct treeNode*) malloc(sizeof(struct treeNode)); 
     (*leaf)->val = d; 
     /* initialize the children to null */ 
     (*leaf)->left = 0; 
     (*leaf)->right = 0; 
     /* initialize the parent */ 
     (*leaf)->parent = *leaf_par; //here I receive segmentation fault 
    } 
    else if(strcmp(d->name, (*leaf)->val->name) < 0) 
    { 
     insert(d, &(*leaf)->left, &(*leaf)); 
    } 
    else if(strcmp(d->name, (*leaf)->val->name) > 0) 
    { 
     insert(d, &(*leaf)->right, &(*leaf)); 
    } 
} 

は私が持っている:

struct treeNode *root = NULL; 
data d1 = {"Smith"}; 
insert(&d1, &root, NULL); 

セグメンテーションフォールトがあります:

(*leaf)->parent = *leaf_par; 

初めて* leaf_parがNULLで、なぜ正しく動作していないのかわかりません。挿入機能をどのように修正すればよいですか? "親"ポインタがなければ簡単ですが、私は "親"でそれを行う必要があり、それは動作していません。

+0

明らかに、あなたは '** leaf_par'に' NULL'を渡していますが、 '* leaf_par'へのアクセスを試行します。この場合、親は何をしたいですか?そのケースをチェックし、それに応じて設定する必要があります。 – lurker

答えて

-1

NULLを逆参照しようとしています。それをしないでください。

あなたの最初のインサートを修正する簡単な方法は次のとおりです。再帰に

insert(&d1, &root, &root); 

深い挿入ポインタを修正します。

+0

これは今、thx :) – Yakimget

関連する問題