Arbre N-aire en C
Airox
Messages postés
146
Date d'inscription
Statut
Membre
Dernière intervention
-
Airox Messages postés 146 Date d'inscription Statut Membre Dernière intervention -
Airox Messages postés 146 Date d'inscription Statut Membre Dernière intervention -
Bonjour à tous,
Je voudrais créer un arbre n-aire mais je me heurte à un problème. Mes algos ne comptent pas d'erreurs et de warnings. Cependant lors de l'affichage de l'arbre, il n'y a que la racine qui est affichée et pas les enfants. J'ai cherché dans mon ajout d'un arbre dans un autre ou dans ma fonction d'affichage mais je ne trouve pas de réponse à mon problème.
Cordialement,
Airox
Je voudrais créer un arbre n-aire mais je me heurte à un problème. Mes algos ne comptent pas d'erreurs et de warnings. Cependant lors de l'affichage de l'arbre, il n'y a que la racine qui est affichée et pas les enfants. J'ai cherché dans mon ajout d'un arbre dans un autre ou dans ma fonction d'affichage mais je ne trouve pas de réponse à mon problème.
Cordialement,
Airox
typedef struct Maillon{ struct Maillon *next; void *info; }Maillon; typedef Maillon *Liste; typedef struct Node { char name[MAX]; char tag[TAG_X][TAG_Y]; int type; Maillon *childs; }Node; typedef Node *Tree; Tree createTree(char *title, int info) { Tree t; t=malloc(sizeof(Node)); stringDup(&t,title); t->type=info; t->childs=NULL; return t; } void AddTree(Tree *a, Tree b) { Liste child = NULL; child = (*a)->childs; while(child != NULL) { child = child->next; } child=malloc(sizeof(Maillon)); child->info = b; child->next=NULL; } void printTree(Tree t) { Liste child = NULL; if (t==NULL) return; printf("%s", t->name); child = t->childs; while(child!=NULL) { child->info=t; printTree(child->info); child=child->next; } }
A voir également:
- Arbre N-aire en C
- Arbre généalogique famille michelin - Télécharger - Généalogie
- Glandier arbre - Forum Logiciels
- Dessin animé arbre qui parle ✓ - Forum Cinéma / Télé
- Télécharger le dernier maître de l'air film complet en français ✓ - Forum Cinéma / Télé
- Adobe aire - Télécharger - Édition & Programmation
3 réponses
Bonjour,
Ce que fait la fonction
Ligne 35,
Ligne 37, on change d'avis,
Ligne 39 à 42,
Ligne 44, on change d'avis,
Ensuite on remplit la zone.
Et on quitte la fonction et on oublie la variable
Finalement, la fonction a fait une promenade dans
Ce qu'il faut faire c'est pointer sur le dernier élément de la liste (qui vaut
Ce que fait la fonction
AddTree():
Ligne 35,
childvaut
NULL.
Ligne 37, on change d'avis,
childvaut le premier fils de
*a.
Ligne 39 à 42,
childva valoir successivement tous les enfants de
*ajusqu'à finir par valoir
NULL.
Ligne 44, on change d'avis,
childva pointer sur une zone allouée.
Ensuite on remplit la zone.
Et on quitte la fonction et on oublie la variable
child(et la zone allouée), et la liste n'a pas changée.
Finalement, la fonction a fait une promenade dans
*a,
bn'a servi à rien et une zone allouée a été perdue.
Ce qu'il faut faire c'est pointer sur le dernier élément de la liste (qui vaut
NULL) avec un
adrChildde type
Liste*puis utiliser ce pointeur pour le remplacer par de la mémoire que l'on alloue.
Salut, merci pour ta réponse.
J'ai bien compris le problème mais je n'arrive pas à traduire en code ce que je pense. J'ai essayé une autre approche mais toujours sans succès.
J'ai bien compris le problème mais je n'arrive pas à traduire en code ce que je pense. J'ai essayé une autre approche mais toujours sans succès.
void AddTree(Tree *a, Tree b) { Liste child = NULL; if ((*a)->childs == NULL) { child=malloc(sizeof(Liste)); child->info=b; child->next=NULL; (*a)->childs=child; } else { child=(*a)->childs; while(child->next != NULL) { child = child->next; } child->next=malloc(sizeof(Liste)); child=child->next; child->info=b; child->next=NULL; } }