Bonjour à tous,
Je rencontre un "léger" problème avec les pointeurs que je n'arrive pas à solutionner. Voici mon code, celui-ci est une espèce d'implémentation d'arbre vraiment très simplifiée. Disons que c'est juste un prétexte pour revoir!
Tout d'abord, voici mon .h avec notamment la définition de la structure Noeud :
Voici ensuite la fonction Ajouter. Celle-ci à pour but de créer un nouveau Noeud contenant un mot et d'ajouter ce Noeud à l'arbre :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct Noeud { char *mot; int cpt; struct Noeud *filsGauche; struct Noeud *filsDroit; }Noeud; typedef struct Noeud *Arbre; int initialiserArbre(Arbre *arbre); int ajouter(Arbre *arbre, char *mot); int placerNoeud(Noeud *noeudArbre, Noeud *noeud); void afficherArbre(Arbre *arbre ); void parcourirArbre(Noeud *noeud);
Cette fonction appelle à la fin la fonction placerNoeud qui va s'occuper de placer le Noeud :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 int ajouter(Arbre *arbre, char *mot){ 9 10 Noeud *noeud; 11 12 if((noeud = (Noeud *) malloc(sizeof(Noeud))) == NULL){ 13 perror("erreur dans l'allocation du noeud \n"); 14 return -1; 15 } 16 17 if((noeud->mot = (char *) malloc(strlen(mot) * sizeof(char))) == NULL){ 18 perror("erreur dans l'allocation de la string \n"); 19 return -1; 20 } 21 22 strcpy(noeud->mot, mot); 23 noeud->cpt = 0; 24 noeud->filsGauche = NULL; 25 noeud->filsDroit = NULL; 26 27 if(*arbre == NULL){ 28 *arbre = noeud; 29 return 1; 30 }else{ if(strcmp(noeud->mot,(*arbre)->mot) > 0){ 32 placerNoeud((*arbre)->filsDroit, noeud); 33 printf("adresse du noeud : %p \n", (*arbre)->filsDroit); 34 }else{ 35 placerNoeud((*arbre)->filsGauche, noeud); 36 printf("adresse du noeud : %p \n", (*arbre)->filsDroit); 37 } 38 } 39 40 }
Je ne poste que ce morceau de code, le reste n'étant qu'un appel récursif.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 int placerNoeud(Noeud *noeudArbre, Noeud *noeud){ 43 printf("dans placerNoeud \n"); 44 printf("%s \n", noeud->mot); 45 printf("%p \n", noeud); 46 if(noeudArbre == NULL){ 47 printf("adresse de noeudArbre : %p\n", noeudArbre); 48 noeudArbre = noeud; 49 printf("adresse de noeudArbre après : %p\n", noeudArbre); 50 printf("noeudArbre : %s \n", noeudArbre->mot); 51 return 1; 52 }
Mon problème est le suivant :
Lors du placement du premier Noeud, celui-ci est bien sauvegardé. Ensuite, lors de la création d'un nouveau Noeud, mon programme va jusqu'à l'appel de la fonction PlacerNoeud et passe en paramètre le filsDroit où le filsGauche du noeud racine, la valeur de ce noeud étant évidement null. Lorsque je rentre dans le if de la fonction PlacerNoeud, la valeur de noeudArbre vaut bien null, ensuite l'instruction noeudArbre = noeud fonctionne sans soucis car l'adresse mémoire de noeudArbre est par après équivalente à celle de noeud et l'affichage du mot se fait sans problème.
Mais, lorsque je retourne dans la fonction ajouter, et que je vérifie l'adresse mémoire du fils qui avait été passé en paramètre, celle-ci vaut à nouveau null! C'est comme ci l'assignation ne valait que tant que je reste dans la méthode PlacerNoeud! J'avoue ne pas comprendre d'où vient mon erreur.
Voici un exemple de run avec les printf, celà sera peut être plus parlant :
En vous remerciant par avance!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 baton /* Je rentre le mot */ zob dans placerNoeud /* indique dans quelle méthode je suis */ zob 0x135c060 /* adresse mémoire du noeud à ajouter */ adresse de noeudArbre : (nil) /* adresse mémoire du fils */ adresse de noeudArbre après : 0x135c060 /* nouvelle adresse mémoire du fils */ noeudArbre : zob /* affichage du mot à partir du fils */ adresse du noeud : (nil) /* de retour dans la méthode appelante, l'adresse mémoire du fils vaut de nouveau null */
Partager