2017-02-09 69 views
0

Я новичок в программировании и работе над реализацией для AVL Trees atm. У меня много проблем и прошу помощи у 1 из них, возможно, после этого я смогу исправить и другие, поскольку все они кажутся довольно похожими.AVL Tree in C, InOrder (и другие функции) не работает

У меня есть следующие функции для печати дерева заказовМои:

void AVL_in_order_walk(AVLTree* avlt) 
{ 
if(avlt!=NULL){ 
     AVL_in_order_walk(avlt->root->left); 
     printf("%d",avlt->root->value); 
     AVL_in_order_walk(avlt->root->right); 
     } 
} 

который, кажется, довольно неправильно. У меня были следующие предупреждения:

passing argument 1 of ‘AVL_in_order_walk’ from incompatible pointer type [enabled by default] 
    AVL_in_order_walk(avlt->root->left); 

У меня появилось несколько ошибок/предупреждений/заметок, подобных этому. Я думаю, что у меня есть одна большая проблема, просто понимающая это: когда у меня есть функция, такая как in_order_walk, которую я опубликовал выше, функция не получает узел, он получает все дерево. Я alreyy worte несколько прогулок по деревьям или insertFunctions, но у функции всегда был узел, из которого он начинался, потому что он назывался как «void Function (Node * X)». Теперь у меня есть все дерево (AVLTree * avlt), и я, похоже, не могу использовать рекурсию из-за этого, я ошибаюсь?

Btw: для структур Tree и Node:

struct AVLTree 
{ 
    struct AVLNode* root; 
    int numberOfNodes; 
}; 

struct AVLNode 
{ 
    struct AVLNode* left;  
    struct AVLNode* right; 
    struct AVLNode* parent; 
    int value; 
    int height; 
}; 

Как его называют:

void AVL_in_order_walk(AVLTree* avlt); 

Я действительно очень ценю любую помощь, так как я просто не понимаю ..

+2

'недействительным AVL_in_order_walk (AVLTree * avlt);' Это функция _declaration_, а не функция _call_. – Olaf

+0

Да, конечно, это было плохо. Я называю это в основном с помощью «AVL_in_order_walk (avlt)»; – ykykyk

+3

В вашем рекурсивном вызове - AVL_in_order_walk (avlt-> root-> left); аргумент передается типа (AVLNode *), тогда как функция ожидает аргумент типа (AVLTree *). Такая же проблема для вызова функции - AVL_in_order_walk (avlt-> root-> right); –

ответ

2

void AVL_in_order_walk(AVLTree* avlt) считается принятым AVLTree*, но вы пытаетесь передать его AVLNode*. Ваш компилятор говорит, что это указатели на разные типы.

Я предлагаю вам добавить скрытую функцию, которую можно назвать рекурсивно, и выполняет фактическую работу.

static void AVL_in_order_walk_implementation(AVLNode* avlt) { 
    /* Implement the walk */ 
} 

extern void AVL_in_order_walk(AVLTree* avlt) { 
    if(avlt) 
    AVL_in_order_walk_implementation(avlt->root); 
} 
+0

Звучит неплохо, но как я его правильно назову? Независимо от того, что я делаю, я получаю 1 миллиард предупреждений/ошибок/... Я не вижу причин что-то менять в основном, поэтому я делаю что-то не так в этих двух функциях, я думаю, я называю это так, как и записал его. Должен ли я что-то менять перед «пустотой»? Если я не получу ошибок, если я назову их «статическими» и «внешними», я получу их тоже. – ykykyk

+0

@ykykyk - Я только что заметил что-то о вашем коде, что заставляет меня задаться вопросом, строите ли вы свой код как C или C++? – StoryTeller

+0

Thats in C, что именно? – ykykyk