2016-11-11 2 views
0

Недавно я начал писать реализацию BST, и я все еще борется с указателями. Первая из моих проблем заключается в том, что я пытаюсь найти «предшественника» данного узла с функцией, которая задает указатель данного узла в качестве аргумента, возвращает указатель на предшественник данного узла. Я пытался логически мыслить, вызывая функцию и давая аргумент, но я застрял.Возвращая указатель из функции и вызывающей функции с указателем рекурсивно - BST

Прежде всего, я объявил «корень» узел «основной», как это: tree *root; , затем вызвать функцию, с которой я называю функцию findPredecessor так: del(&root, k1);, вот объявление о del функции : void del(tree **root, int k), тогда я использую «итератор», с которым я просматриваю все дерево BST, объявленное следующим образом: tree *w = NULL. Наконец, вот как я называю findPredecessor функции (внутри del функции): 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().