2017-05-05 6 views
0

私はcを新しくしましたが、他の言語でプログラミングしました。私はBSTの挿入のためのコードのこの部分を持っている:再帰を使用してCにBSTを挿入

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

struct tnode* addnode(struct tnode* root, int data) { 
    if (root == NULL) return talloc(data); 
    else if (data < root->data) root->left = addnode(root->left, data); 
    else root->right = addnode(root->right, data); 
} 

コードは完璧にうまく動作しますが、それは、それがどのように動作するかを理解しようと狂気私を運転です。私はそれが正しく返されるべきではないと感じるが、私はそれを広範囲にテストし、それは機能する。私の不満は、値がNULLではないルートでaddnodeを呼び出すと、再帰的にaddnodeを呼び出し、新しいtnodeをroot-> leftまたはroot-> rightに返します。これは問題ありません。ただし、再帰呼び出しが返された後、関数は元の呼び出しのその時点から実行を再開する必要があります。その後、if-else節の後に再開する必要があります。その条項の後には返還はありません。複数の項目を追加すると、どうして元通りに戻りますか?

私は物事を試していて、をif-else節の後に追加しました。それは全体を混乱させ、セグメンテーションフォルトを与えました:11(それが何であれ)。

+0

もtalloc機能を追加しました。 –

+2

関数の 'else if'または' else'分岐の戻り値がないので、コンパイルの警告を受け取るべきです。おそらく、 '}'の前に 'return root;'を置いておくべきでしょう。 –

答えて

2

あなたは絶対に正しいです。あなたが持っている関数は、間違いなくあなたに混乱を与えるelse文の後ろに戻り呼び出しがありません。次の機能を試してみてください:

struct tnode* addnode(struct tnode* root, int data) { 
    if (root == NULL) return talloc(data); 
    else if (data < root->data) root->left = addnode(root->left, data); 
    else root->right = addnode(root->right, data); 
    return root; 
} 

これが役立つかどうか教えてください。ハッピープログラミング!

+0

ありがとう、これははるかに理にかなっています。 OPのバージョンがなぜ働いたのか?それは私にとってとても奇妙なようです。 –

関連する問題