2017-02-09 6 views
0

Im un débutant à la programmation et de travailler à une mise en œuvre pour AVL arbres ATM. J'ai eu beaucoup de problèmes et demandé de l'aide à l'un d'entre eux, peut-être que je serai en mesure de réparer les autres après, car ils semblent tous assez similaires.AVL Tree dans C, InOrder (et d'autres fonctions) ne fonctionne pas

J'ai la fonction suivante pour imprimer l'arbre afinde:

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); 
     } 
} 

Ce qui semble être assez mal. J'ai eu des avertissements suivants:

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

J'ai eu plusieurs erreurs/avertissements/notes comme celui-ci. Je pense que j'ai un gros problème en comprenant simplement ceci: Quand j'ai une fonction comme l'in_order_walk que j'ai posté ci-dessus, la fonction n'obtient pas un noeud, elle obtient l'arbre entier. J'ai déjà parcouru quelques marches à travers les arbres, ou insertFunctions, mais la fonction a toujours eu un nœud à partir duquel elle a été appelée, car elle s'appelait "void Function (Node * X)". Maintenant j'ai l'arbre entier (AVLTree * avlt) et je ne semble pas pouvoir utiliser la récursion à cause de ça, ai-je tort?

BTW: Structs pour Arbre et Noeud:

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

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

Comment l'appelle:

void AVL_in_order_walk(AVLTree* avlt); 

Je voudrais vraiment vraiment apprécier tout type d'aide que je juste ne l'obtenir ..

+2

'AVL_in_order_walk void (* AVLTree avlt)' C'est une fonction _declaration_, pas une _call_ fonction. – Olaf

+0

Oui bien sûr c'était mon mauvais. Je l'appelle dans le principal avec "AVL_in_order_walk (avlt);" – ykykyk

+3

Dans votre appel récursif - AVL_in_order_walk (avlt-> root-> left) ;, l'argument passé est de type (AVLNode *) tandis que la fonction attend un argument de type (AVLTree *). Même problème pour l'appel de fonction - AVL_in_order_walk (avlt-> root-> right); –

Répondre

2

void AVL_in_order_walk(AVLTree* avlt) est déclaré accepter un AVLTree*, mais vous essayez de lui passer un AVLNode*. Votre compilateur dit que ce sont des pointeurs vers différents types.

Je vous suggère d'ajouter une fonction cachée qui peut être appelée récursivement, et fonctionne réellement.

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

Ça sonne bien, mais comment l'appeler correctement? Peu importe ce que je fais, je reçois 1 milliard d'avertissements/erreurs/... Je ne vois aucune raison de changer quelque chose dans le principal, donc Im faire quelque chose de mal dans ces 2 fonctions je suppose, je l'appelle comme vous l'avez écrit. Dois-je changer quelque chose avant le "vide"? Si je ne reçois pas d'erreurs, si je les appelle "statiques" et "extern" je les obtiens aussi .. – ykykyk

+0

@ykykyk - J'ai juste remarqué quelque chose à propos de votre code qui me fait réfléchir, construisez-vous votre code en C ou C++? – StoryTeller

+0

Cest en C, quoi exactement? – ykykyk