2016-11-11 5 views
0

最近、私はBSTの実装を書くようになりましたが、私はまだポインタで苦労しています。私の問題の第一は、与えられたノードのポインタが引数として渡され、与えられたノードの先行ノードへのポインタを返す、関数を持つ与えられたノードの '先祖'を見つけることです。私は関数を呼び出して引数を与えて論理的に考えようとしましたが、私は立ち往生しています。ポインタを関数から呼び出し、ポインタを再帰的に呼び出す - BST

まず第一に、私はこのような「メイン」に「ルート」ノードを宣言した:tree *root; 、その後、私は私はこのような機能findPredecessorを呼び出し、そこから機能を呼び出す:del(&root, k1);を、ここでdel関数の宣言です:void del(tree **root, int k)私はこのように宣言された全体のBSTツリーを通過する 'iterator'を使用します:tree *w = NULL。最後に、ここで私は(del関数内)findPredecessor関数を呼び出す方法は次のとおりです。tree *predecessor = findPredecessor(w);と私はエラーC2040 'FindPredecessor': 'tree *(tree *)' differs in levels of indirection from 'int()'を取得し、ここでfindPredecessor関数の本体です:

tree* findPredecessor(tree *w) { 
w = w->left; 
while (w->right != NULL) { 
    w = w->right; 
} 
return w;} 

私もツリー全体からメモリを割り当て解除しstruglingだ、ここです身体機能のDELALL:

void delAll(tree **root) { 
    if (*root == NULL) { 
     return; 
    } 
    delAll(&((*root)->left)); 
    delAll(&((*root)->right)); 
    free(*root); 
} 

、私はdelでそうであるように、私は「メイン」同じやり方で呼んでいます。私は私の問題が何らかの種類の参照/ポインタ関連であることを知っている、私は助けに感謝するだろう。私の英語のために申し訳ありません。

答えて

0

宣言する前にfindPredecessor()を呼び出すと思います。前方宣言を追加するだけです。 findPredecessor()がdel()の前に実装されるように、コードを再配置することもできます。

関連する問題