4d4b97fd646184319ecb98b2321a91bcce08dd25
1 /*****************************************************************************/
3 /* Representation d'un ensemble de mots sous forme d'arbre n-aire */
4 /*****************************************************************************/
11 /* nombre de caracteres max dans un mot */
15 typedef struct noeud
{
23 /* Recherche d'un mot dans l'arbre *****************************************/
24 int recherche(NOEUD
*p
, char *mot
, int i
)
32 /* Creation d'une fin de mot (liste chainee suivant le lien fils) **********/
33 NOEUD
*insere_fin(char *mot
, int i
) /* i est l'indice de la lettre courante dans le mot */
35 printf("insere_fin %c, %i\n", mot
[i
], i
);
36 NOEUD
*p
= (NOEUD
*)malloc(sizeof(NOEUD
));
37 if(p
== NULL
) exit(-1);
41 if(mot
[i
]) p
->fils
= insere_fin(mot
, i
+1);
46 /* Insertion d'un mot dans l'arbre ******************************************/
47 /* (on respecte l'ordre lexicographique des freres)**************************/
48 NOEUD
*insere(NOEUD
*p
, char *mot
, int i
) /* i est l'indice de la lettre courante dans le mot */
51 if(p
== NULL
) p
= insere_fin(mot
, i
);
56 /*****************************************************************************/
57 /* Affichage par ordre alphabetique de tous les mots stockes dans l'arbre */
58 void affiche(NOEUD
*p
, char *mot
, int i
) /* i est l'indice de la lettre courante dans le mot */
64 /* Visualisation de l'arbre n-aire *******************************************/
65 void affiche_arbre(NOEUD
*p
, int prof
) /* prof est utilise pour decaller l'affichage avec des espaces (selon le niveau dans l'arbre) */
70 affiche_arbre(p
->frere
,prof
);
71 for (i
=0;i
<prof
;i
++) printf(" ");
72 printf("%c\n",p
->lettre
);
73 affiche_arbre(p
->fils
,prof
+1);
78 /* Suppression d'un mot de l'arbre ********************************************/
79 /* Attention a ne supprimer que la fin du mot qui n'est partagee par aucun autre mot de l'arbre */
80 NOEUD
*supprime(NOEUD
*p
, char *mot
, int i
) /* i est l'indice de la lettre courante dans le mot */
88 /* Chargement des mots d'un fichier (vu comme un dictionnaire) dans l'arbre **/
89 NOEUD
*charge_dico(char *nom_fichier
, int *nb_mots
)
97 fp
= fopen(nom_fichier
,"rt");
98 if (fp
== NULL
) exit(-1);
99 fscanf(fp
,"%d",nb_mots
); /* sur la 1ere ligne du fichier, le nombre de mots */
100 for (i
=0; i
< *nb_mots
; i
++)
103 p
= insere(p
, mot
, 0); /* TODO il faut finir "insere" pour que "charge_dico" fonctionne */
111 /* Ecriture dans fp de tous les mots stockes dans l'arbre ********************/
112 void affiche_fich(FILE *fp
, NOEUD
*p
, char *mot
, int i
)
115 /* ressemble beaucoup a "affiche", avec le parametre en plus "fp" qui est un FILE* */
119 /* Sauvegarde des mots de l'arbre dans un fichier ****************************/
120 void sauve_dico(NOEUD
*p
, char *nom_fichier
, int nb_mots
)
125 fp
= fopen(nom_fichier
,"wt");
126 if (fp
== NULL
) exit(-1);
127 fprintf(fp
,"%d\n",nb_mots
);
128 affiche_fich(fp
,p
,mot
,0); /* TODO il faut finir la fonction "affiche_fich" pour que "sauve_dico" fonctionne */
135 /*****************************************************************************/
136 int main(int argc
, char *argv
[])
141 printf("saisir un mot : ");
144 printf("\ninsertion de %s\n", mot
);
145 arbre
= insere(arbre
, mot
, 0);
147 printf("\naffichage arbre :\n");
148 affiche_arbre(arbre
, 0);
156 /* Exemple de trace d'execution *************************
158 saisir un mot : salut
177 **********************************************************/