Bonjour,
J'ai cherche sur le forum les réponses à mes questions, mais certaines restent sans réponses ou un peu floues... :(
Je vous explique mon problème:
Je dois faire un projet un C, dans lequel j'ai décidé d'utiliser une structure d'arbre pour représenter des mots/phrases.
Voici la structure de mes noeuds:
typedef struct t_Noeud t_Noeud;
struct t_Noeud{
char C; //Caractère du noeud
unsigned int Nb_fils;
t_Noeud* *Fils; //Tableau dynamique de liens vers la suite de l'arbre.
};
J'appelle "fils" les liens vers la suite de l'arbre.
Voici un exemple d'arbre (fait sous paint :euh: ) pour que vous voyez ce que je veux modéliser:
http://img232.imageshack.us/img232/4151/exemplearbreah3.jpg
Donc en gros chaque noeud peut avoir un nombre variable de fils de 0 à 255.
Voici la fonction que j'utilise pour rajouter un fils et la fonction d'initialisation d'un noeud:
void Initialiser_Noeud(t_Noeud *i_Ptr_noeud, char i_Car)
{
i_Ptr_noeud->C = i_Car;
i_Ptr_noeud->Nb_fils = 0;
i_Ptr_noeud->Fils = NULL;
}
void Ajouter_nouvelle_chaine(t_Noeud *i_Ptr_noeud, char i_Car)
{
size_t Taille_alloc_fils = i_Ptr_noeud->Nb_fils + 1;
size_t Taille_alloc_noeud = sizeof(t_Noeud);
/*Agrandir tableau de "fils de 1 case
*fonctionne comme malloc(Taille_alloc_fils) si i_Ptr_noeud->Fils == NULL
*/
i_Ptr_noeud->Fils = realloc(i_Ptr_noeud->Fils,Taille_alloc_fils);
//Ajouter un nouveau noeud en dernière position
i_Ptr_noeud->Fils[i_Ptr_noeud->Nb_fils] = malloc(Taille_alloc_noeud);
//Initialisation du nouveau noeud.
Initialiser_Noeud(i_Ptr_noeud->Fils[i_Ptr_noeud->Nb_fils],i_Car);
//Le nombre de fils est incrémenté.
i_Ptr_noeud->Nb_fils++;
}
Ce code marche si mes souvenirs d'hier sont bons mais le fait est que j'ai du mal avec les passages de paramètres en langage C...
Alors voici la liste de question auxquelles j'espère vous pourrez répondre :)
Question 3:
Nos professeurs nous ont conseillé d'éviter d'utiliser la fonction realloc().
Donc j'aimerai à partir de malloc() et free() agrandir mon tableau de 1 case et le recopier, et le rendre dans le paramètre "t_Noeud *i_Ptr_noeud".
Que faut-il que je modifie dans la signature de ma fonction pour que cela soit possible?
Question 2:
Dans la fonction void Ajouter_nouvelle_chaine(t_Noeud *i_Ptr_noeud, char i_Car)
je modifie le noeud repéré par le pointeur que je passe en paramètre. Mais ce pointeur est censé être seulement une copie du vrai pointeur (celui de la fonction appelante).
Alors comment ce fait-il que mes modifications soient prises en compte?
Les modifications étant:
-Agrandissement du tableau.
-Ajout d'un nouveau noeud à la fin de ce même tableau
-Incrémentation du champ: Nb_fils
Je me pose la même question lorsque j'initialise mon noeud...
Question 3:
A la fin de mon algorithme, il faut que je libère mon arbre. Dans Mon cas, le code suivant suffit-il?
void main()
{
//Début du programme
t_Noeud *Racine = malloc(sizeof(t_Noeud)), *P = NULL;
Initialiser_Noeud(Racine,'@');
//Corps du programme
//...
//...
//Fin du programme
free(Racine);
}
ou faut-il que je parcours mon arbre complètement et libérer 1 à 1 chaque noeud de l'arbre?
Si c'est le cas, la signature suivante convient-elle? (La fonction étant une fonction récursive) Car la le pointeur sera une recopie du pointeur de la fonction appelante...
void Liberer_noeud(t_Noeud *i_Ptr_Noeud);
Merci à ceux qui auront eu la patience et le courage de lire ce long post...
Si vous avez besoin de plus de précision ou explications n'hésitez pas.Configuration: Windows XP
Firefox 2.0.0.12

