Arbre N-aire en C
Fermé
Airox
Messages postés
146
Date d'inscription
vendredi 1 août 2014
Statut
Membre
Dernière intervention
5 novembre 2018
-
25 oct. 2017 à 14:35
Airox Messages postés 146 Date d'inscription vendredi 1 août 2014 Statut Membre Dernière intervention 5 novembre 2018 - 8 nov. 2017 à 23:45
Airox Messages postés 146 Date d'inscription vendredi 1 août 2014 Statut Membre Dernière intervention 5 novembre 2018 - 8 nov. 2017 à 23:45
A voir également:
- Arbre N-aire en C
- Arbre généalogique famille michelin - Télécharger - Généalogie
- Faire son arbre généalogique gratuit sans inscription ✓ - Forum Loisirs / Divertissements
- Arbre qui parle disney ✓ - Forum Cinéma / Télé
- Arbre catia disparu - Forum Logiciels
- Arbre genealogique windsor - Télécharger - Généalogie
3 réponses
Dalfab
Messages postés
706
Date d'inscription
dimanche 7 février 2016
Statut
Membre
Dernière intervention
2 novembre 2023
101
25 oct. 2017 à 20:39
25 oct. 2017 à 20:39
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.
Airox
Messages postés
146
Date d'inscription
vendredi 1 août 2014
Statut
Membre
Dernière intervention
5 novembre 2018
13
27 oct. 2017 à 14:30
27 oct. 2017 à 14:30
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; } }
Dalfab
Messages postés
706
Date d'inscription
dimanche 7 février 2016
Statut
Membre
Dernière intervention
2 novembre 2023
101
Modifié le 28 oct. 2017 à 03:54
Modifié le 28 oct. 2017 à 03:54
Il manque une indirection, pour modifier
(*a)->childsil faut pointer dessus
void AddTree(Tree *a, Tree b) { Liste *pChild = &(*a)->childs; while ( *pChild != NULL ) { pChild = &(*pChild)->next; } *pChild = malloc(sizeof(Liste)); (*pChild)->info = b; (*pChild)->next = NULL; }
Airox
Messages postés
146
Date d'inscription
vendredi 1 août 2014
Statut
Membre
Dernière intervention
5 novembre 2018
13
8 nov. 2017 à 23:45
8 nov. 2017 à 23:45
Merci Dalfad pour avoir pris le temps de me répondre. J'ai trouvé que cette structure était trop casse tête, je suis donc partie un arbre composé de listes chaînées :)