63981b59fd024db4b7f67d555a295075a1dcf362
1 /*****************************************************************************/
4 /* Representation d'un ensemble de mots sous forme d'arbre n-aire */
5 /*****************************************************************************/
12 /* nombre de caracteres max dans un mot */
22 /* Recherche d'un mot dans l'arbre *****************************************/
24 recherche (NOEUD
* p
, char *mot
, int i
)
28 if (mot
[i
] == p
->lettre
)
36 return recherche (p
->fils
, mot
, i
+ 1);
41 if (p
->lettre
> mot
[i
])
47 return recherche (p
->frere
, mot
, i
);
52 /* Creation d'une fin de mot (liste chainee suivant le lien fils) **********/
54 insere_fin (char *mot
, int i
)
56 /* i est l'indice de la lettre courante dans le mot */
57 printf ("insere_fin %c, %i\n", mot
[i
], i
);
58 NOEUD
*p
= (NOEUD
*) malloc (sizeof (NOEUD
));
65 p
->fils
= insere_fin (mot
, i
+ 1);
69 /* Insertion d'un mot dans l'arbre ******************************************/
70 /* (on respecte l'ordre lexicographique des freres)**************************/
72 insere (NOEUD
* p
, char *mot
, int i
)
74 /* i est l'indice de la lettre courante dans le mot */
77 p
= insere_fin (mot
, i
);
81 /*****************************************************************************/
82 /* Affichage par ordre alphabetique de tous les mots stockes dans l'arbre */
84 affiche (NOEUD
* p
, char *mot
, int i
)
86 /* i est l'indice de la lettre courante dans le mot */
90 affiche (p
->fils
, mot
, i
+ 1);
95 affiche (p
->frere
, mot
, i
);
99 /* Visualisation de l'arbre n-aire *******************************************/
101 affiche_arbre (NOEUD
* p
, int prof
)
102 /* prof est utilise pour decaller l'affichage avec des espaces (selon le niveau dans l'arbre) */
107 affiche_arbre (p
->frere
, prof
);
108 for (i
= 0; i
< prof
; i
++)
110 printf ("%c\n", p
->lettre
);
111 affiche_arbre (p
->fils
, prof
+ 1);
115 /* Suppression d'un mot de l'arbre ********************************************/
116 /* Attention a ne supprimer que la fin du mot qui n'est partagee par aucun autre mot de l'arbre */
118 supprime (NOEUD
* p
, char *mot
, int i
)
119 /* i est l'indice de la lettre courante dans le mot */
125 /* Chargement des mots d'un fichier (vu comme un dictionnaire) dans l'arbre **/
127 charge_dico (char *nom_fichier
, int *nb_mots
)
134 fp
= fopen (nom_fichier
, "rt");
137 fscanf (fp
, "%d", nb_mots
); /* sur la 1ere ligne du fichier, le nombre de mots */
138 for (i
= 0; i
< *nb_mots
; i
++)
140 fscanf (fp
, "%s", mot
);
141 p
= insere (p
, mot
, 0); /* TODO il faut finir "insere" pour que "charge_dico" fonctionne */
147 /* Ecriture dans fp de tous les mots stockes dans l'arbre ********************/
149 affiche_fich (FILE * fp
, NOEUD
* p
, char *mot
, int i
)
152 /* ressemble beaucoup a "affiche", avec le parametre en plus "fp" qui est un FILE* */
155 /* Sauvegarde des mots de l'arbre dans un fichier ****************************/
157 sauve_dico (NOEUD
* p
, char *nom_fichier
, int nb_mots
)
161 fp
= fopen (nom_fichier
, "wt");
164 fprintf (fp
, "%d\n", nb_mots
);
165 affiche_fich (fp
, p
, mot
, 0); /* TODO il faut finir la fonction "affiche_fich" pour que "sauve_dico" fonctionne */
169 /*****************************************************************************/
171 main (int argc
, char *argv
[])
175 printf ("saisir un mot : ");
177 printf ("\ninsertion de %s\n", mot
);
178 arbre
= insere (arbre
, mot
, 0);
179 printf ("\naffichage mots:\n");
180 affiche (arbre
, mot
, 0);
181 printf ("\naffichage arbre :\n");
182 affiche_arbre (arbre
, 0);
183 if (recherche (arbre
, "toto", 0))
184 printf ("mot present\n");
188 /* Exemple de trace d'execution *************************
190 saisir un mot : salut
209 **********************************************************/