/* nombre de caracteres max dans un mot */
#define N 30
-typedef struct noeud
-{
- char lettre;
- struct noeud *fils;
- struct noeud *frere;
+typedef struct noeud {
+ char lettre;
+ struct noeud *fils;
+ struct noeud *frere;
} NOEUD;
/* Recherche d'un mot dans l'arbre *****************************************/
-bool
-recherche (NOEUD * p, char *mot, int i)
+bool recherche(NOEUD * p, char *mot, int i)
{
- if (p == NULL)
- return false;
- if (mot[i] == p->lettre)
- {
- if (mot[i] == '\0')
- {
- return true;
- }
- else
- {
- return recherche (p->fils, mot, i + 1);
- }
- }
- else
- {
- if (p->lettre > mot[i])
- {
- return false;
+ if (p == NULL)
+ return false;
+ if (mot[i] == p->lettre) {
+ if (mot[i] == '\0') {
+ return true;
+ } else {
+ return recherche(p->fils, mot, i + 1);
}
- else
- {
- return recherche (p->frere, mot, i);
+ } else {
+ if (p->lettre > mot[i]) {
+ return false;
+ } else {
+ return recherche(p->frere, mot, i);
}
}
}
/* Creation d'une fin de mot (liste chainee suivant le lien fils) **********/
-NOEUD *
-insere_fin (char *mot, int i)
+NOEUD *insere_fin(char *mot, int i)
{
- /* i est l'indice de la lettre courante dans le mot */
- printf ("insere_fin %c, %i\n", mot[i], i);
- NOEUD *p = (NOEUD *) malloc (sizeof (NOEUD));
- if (p == NULL)
- exit (-1);
- p->lettre = mot[i];
- p->fils = NULL;
- p->frere = NULL;
- if (mot[i])
- p->fils = insere_fin (mot, i + 1);
- return p;
+ /* i est l'indice de la lettre courante dans le mot */
+ printf("insere_fin %c, %i\n", mot[i], i);
+ NOEUD *p = (NOEUD *) malloc(sizeof(NOEUD));
+ if (p == NULL)
+ exit(-1);
+ p->lettre = mot[i];
+ p->fils = NULL;
+ p->frere = NULL;
+ if (mot[i])
+ p->fils = insere_fin(mot, i + 1);
+ return p;
}
/* Insertion d'un mot dans l'arbre ******************************************/
/* (on respecte l'ordre lexicographique des freres)**************************/
-NOEUD *
-insere (NOEUD * p, char *mot, int i)
+NOEUD *insere(NOEUD * p, char *mot, int i)
{
- /* i est l'indice de la lettre courante dans le mot */
- /* TODO */
- if (p == NULL)
- p = insere_fin (mot, i);
- return p;
+ /* i est l'indice de la lettre courante dans le mot */
+ if (p == NULL)
+ return p = insere_fin(mot, i);
+ if (mot[i] == p->lettre) {
+
+ return insere(p->fils, mot, i + 1);
+ }
+ //return insere (p->frere, mot, i);
+ if (mot[i] > p->lettre) {
+ return insere(p->frere, mot, i);
+ }
}
/*****************************************************************************/
/* Affichage par ordre alphabetique de tous les mots stockes dans l'arbre */
-void
-affiche (NOEUD * p, char *mot, int i)
+void affiche(NOEUD * p, char *mot, int i)
{
- /* i est l'indice de la lettre courante dans le mot */
- if (p != NULL)
- {
- mot[i] = p->lettre;
- affiche (p->fils, mot, i + 1);
- if (mot[i] == '\0')
- {
- printf ("%s\n", mot);
+ /* i est l'indice de la lettre courante dans le mot */
+ if (p != NULL) {
+ mot[i] = p->lettre;
+ affiche(p->fils, mot, i + 1);
+ if (mot[i] == '\0') {
+ printf("%s\n", mot);
}
- affiche (p->frere, mot, i);
+ affiche(p->frere, mot, i);
}
}
/* Visualisation de l'arbre n-aire *******************************************/
-void
-affiche_arbre (NOEUD * p, int prof)
+void affiche_arbre(NOEUD * p, int prof)
/* prof est utilise pour decaller l'affichage avec des espaces (selon le niveau dans l'arbre) */
{
- int i;
- if (p)
- {
- affiche_arbre (p->frere, prof);
- for (i = 0; i < prof; i++)
- printf (" ");
- printf ("%c\n", p->lettre);
- affiche_arbre (p->fils, prof + 1);
+ int i;
+ if (p) {
+ affiche_arbre(p->frere, prof);
+ for (i = 0; i < prof; i++)
+ printf(" ");
+ printf("%c\n", p->lettre);
+ affiche_arbre(p->fils, prof + 1);
}
}
/* Suppression d'un mot de l'arbre ********************************************/
/* Attention a ne supprimer que la fin du mot qui n'est partagee par aucun autre mot de l'arbre */
-NOEUD *
-supprime (NOEUD * p, char *mot, int i)
+NOEUD *supprime(NOEUD * p, char *mot, int i)
/* i est l'indice de la lettre courante dans le mot */
{
- /* TODO */
- return p;
+ /* TODO */
+ return p;
}
/* Chargement des mots d'un fichier (vu comme un dictionnaire) dans l'arbre **/
-NOEUD *
-charge_dico (char *nom_fichier, int *nb_mots)
+NOEUD *charge_dico(char *nom_fichier, int *nb_mots)
{
- NOEUD *p;
- FILE *fp;
- char mot[N];
- int i;
- p = NULL;
- fp = fopen (nom_fichier, "rt");
- if (fp == NULL)
- exit (-1);
- fscanf (fp, "%d", nb_mots); /* sur la 1ere ligne du fichier, le nombre de mots */
- for (i = 0; i < *nb_mots; i++)
- {
- fscanf (fp, "%s", mot);
- p = insere (p, mot, 0); /* TODO il faut finir "insere" pour que "charge_dico" fonctionne */
+ NOEUD *p;
+ FILE *fp;
+ char mot[N];
+ int i;
+ p = NULL;
+ fp = fopen(nom_fichier, "rt");
+ if (fp == NULL)
+ exit(-1);
+ fscanf(fp, "%d", nb_mots); /* sur la 1ere ligne du fichier, le nombre de mots */
+ for (i = 0; i < *nb_mots; i++) {
+ fscanf(fp, "%s", mot);
+ p = insere(p, mot, 0);
}
- fclose (fp);
- return p;
+ fclose(fp);
+ return p;
}
/* Ecriture dans fp de tous les mots stockes dans l'arbre ********************/
-void
-affiche_fich (FILE * fp, NOEUD * p, char *mot, int i)
+void affiche_fich(FILE * fp, NOEUD * p, char *mot, int i)
{
- /* TODO */
- /* ressemble beaucoup a "affiche", avec le parametre en plus "fp" qui est un FILE* */
+ /* TODO */
+ /* ressemble beaucoup a "affiche", avec le parametre en plus "fp" qui est un FILE* */
}
/* Sauvegarde des mots de l'arbre dans un fichier ****************************/
-void
-sauve_dico (NOEUD * p, char *nom_fichier, int nb_mots)
+void sauve_dico(NOEUD * p, char *nom_fichier, int nb_mots)
{
- FILE *fp;
- char mot[N];
- fp = fopen (nom_fichier, "wt");
- if (fp == NULL)
- exit (-1);
- fprintf (fp, "%d\n", nb_mots);
- affiche_fich (fp, p, mot, 0); /* TODO il faut finir la fonction "affiche_fich" pour que "sauve_dico" fonctionne */
- fclose (fp);
+ FILE *fp;
+ char mot[N];
+ fp = fopen(nom_fichier, "wt");
+ if (fp == NULL)
+ exit(-1);
+ fprintf(fp, "%d\n", nb_mots);
+ affiche_fich(fp, p, mot, 0); /* TODO il faut finir la fonction "affiche_fich" pour que "sauve_dico" fonctionne */
+ fclose(fp);
}
/*****************************************************************************/
-int
-main (int argc, char *argv[])
+int main(int argc, char *argv[])
{
- char mot[N];
- NOEUD *arbre = NULL;
- printf ("saisir un mot : ");
- gets (mot);
- printf ("\ninsertion de %s\n", mot);
- arbre = insere (arbre, mot, 0);
- printf ("\naffichage mots:\n");
- affiche (arbre, mot, 0);
- printf ("\naffichage arbre :\n");
- affiche_arbre (arbre, 0);
- if (recherche (arbre, "toto", 0))
- printf ("mot present\n");
- /* TODO */
+ char mot[N];
+ int nb_mots = 0;
+ NOEUD *arbre = NULL;
+ //printf ("saisir un mot : ");
+ //gets (mot);
+ //printf ("\ninsertion de %s\n", mot);
+ //arbre = insere (arbre, mot, 0);
+ arbre = charge_dico("dictionnaire", &nb_mots);
+ printf("\naffichage mots :\n");
+ affiche(arbre, mot, 0);
+ printf("\naffichage arbre :\n");
+ affiche_arbre(arbre, 0);
+ if (recherche(arbre, "salut", 0))
+ printf("mot \"salut\" present\n");
+ /* TODO */
}
/* Exemple de trace d'execution *************************