From 04b8ce9413659e8801a705e286ccdba433e5689d Mon Sep 17 00:00:00 2001 From: vsalingu Date: Mon, 29 Apr 2019 19:04:03 +0200 Subject: [PATCH] Modification de la strcutre, ajout d'un bool pour savoir si l'enchainement des lettres correspond à un mot valide, ajout fonction affichage --- a.out | Bin 0 -> 16376 bytes conv-accents.sh | 4 ++++ dico | Bin 0 -> 16616 bytes dico.c | 110 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------------------------- dico.c~ | 95 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ projet | Bin 0 -> 8880 bytes words1.txt | 5 +++++ words1.txt~ | 5 +++++ words1~ | 1 + 9 files changed, 192 insertions(+), 28 deletions(-) create mode 100755 a.out create mode 100644 conv-accents.sh create mode 100755 dico create mode 100644 dico.c~ create mode 100755 projet create mode 100644 words1.txt create mode 100644 words1.txt~ create mode 100644 words1~ diff --git a/a.out b/a.out new file mode 100755 index 0000000..bd999db Binary files /dev/null and b/a.out differ diff --git a/conv-accents.sh b/conv-accents.sh new file mode 100644 index 0000000..c3f7f38 --- /dev/null +++ b/conv-accents.sh @@ -0,0 +1,4 @@ +if [ $# -ne 1 ] +then echo "Usage: $0 /usr/share/dict/your_language (creates a local copy with accents converted)" +else iconv -f utf8 -t ascii//TRANSLIT $1 > `basename $1`-no-accents +fi diff --git a/dico b/dico new file mode 100755 index 0000000..0f08697 Binary files /dev/null and b/dico differ diff --git a/dico.c b/dico.c index bef55dd..a898ae3 100644 --- a/dico.c +++ b/dico.c @@ -1,5 +1,6 @@ #include #include +#include typedef struct cell* ptarbre; @@ -7,8 +8,9 @@ typedef struct cell* ptcellule; typedef struct cell { char lettre; - ptarbre arbre; // Descend d'un étage dans le mot (lettre suivante du mot) + ptarbre fils; // Descend d'un étage dans le mot (lettre suivante du mot) ptcellule suivant; // Lettre suivante stockée à l'étage arbre en (ieme position) + bool fin_mot; } cell; /* Pas utile @@ -20,21 +22,27 @@ void init_dico() */ ptarbre rech(ptarbre arbre, char lettre) // recherche une lettre en ième position (correspondant à arbre) -// Retourne l'adresse de l'abre contenant la lettre à cette position +// Retourne l'adresse de l'arbre contenant la lettre à cette position { - while((arbre!=NULL) && (arbre->lettre != lettre)) + if (arbre!=NULL) { - printf("lettre : %c lettre cherchee : %c\n", (arbre->lettre),lettre); - arbre=arbre->suivant; + printf("arbre lettre %c \n", arbre->lettre); + while ((arbre->suivant!=NULL) && (arbre->lettre != lettre)) + { + printf("lettre : %c lettre cherchee : %c adr arbre %p \n", arbre->lettre,lettre, arbre); + arbre=(arbre->suivant); + } } return arbre; } void init_dico(ptarbre *parbre, char lettre) { (*parbre)=malloc(sizeof(cell)); - (*parbre)->arbre=malloc(sizeof(cell)); + (*parbre)->fils=malloc(sizeof(cell)); + (*parbre)->fils->suivant=NULL; (*parbre)->suivant=NULL; (*parbre)->lettre=lettre; + (*parbre)->fin_mot=false; printf("init dico\n"); } @@ -42,23 +50,57 @@ void ajout_dico(ptarbre *parbre, ptarbre *parbresuiv, char lettre) { *parbresuiv=malloc(sizeof(cell)); (*parbre)->suivant=*parbresuiv; // On relie la nouvelle lettre à l'avant dernière lettre - (*parbresuiv)->arbre=malloc(sizeof(cell)); + (*parbresuiv)->fils=malloc(sizeof(cell)); + (*parbresuiv)->fils->suivant=NULL; (*parbresuiv)->suivant=NULL; + (*parbresuiv)->fin_mot=false; (*parbresuiv)->lettre=lettre; - printf("ajout lettre : %c \n",(*parbresuiv)->lettre); + printf("ajout lettre : %c à %p \n",(*parbresuiv)->lettre, parbresuiv); } void affiche_dico(ptarbre arbre) // affiche tout le dictionnaire à partir de l'arbre (donc le numéro de lettre) sélectionné { - + if(arbre == NULL) + { + return; + } + else + { + if (arbre->fils!=NULL) + { + printf("%c\n", (arbre->lettre)); + while(arbre->suivant !=NULL) + { + printf("%c\n", (arbre->lettre)); + affiche_dico(arbre->fils); + arbre=arbre->suivant; + } + } + } + } - + +void free_tree(cell **ptr_tree) +{ + if ((*ptr_tree)==NULL) + printf("L'arbre est vide\n"); + else + { + if ((*ptr_tree)->fils!=NULL) + free_tree(&((*ptr_tree)->fils)); + if ((*ptr_tree)->suivant!=NULL) + free_tree(&(*ptr_tree)->suivant); + free(*ptr_tree); + } +} + int main() { - ptarbre arbre_originel,arbre; + ptarbre arbre_originel,arbre,arbre_prec; arbre_originel=NULL; + arbre=NULL; char c,t; ptarbre rec; // Ouvrir fichier @@ -70,50 +112,62 @@ int main() while (fscanf(fp,"%c",&c)!= EOF) // lecture de tout le fichier { - // while (fscanf(fp,"%d",&c)!='\n') // Tant que le mot n'est pas fini, on ajoute les lettres à la suite - // { if (c != '\n') { if (arbre_originel==NULL) // Cas où c'est le premier mot { printf("arbre =NULL \n"); init_dico(&arbre_originel,c); - - arbre=arbre_originel->arbre; + printf("lettre arbre :%c \n",arbre_originel->lettre); + arbre_prec=arbre_originel; + arbre=arbre_originel->fils; } else // Cas où le dico n'est pas vide { + printf("lettre arbre :%c \n",arbre->lettre); printf(" c: %c\n", c); rec=rech(arbre,c); - printf("adr rech %p\n",rech(arbre,c)); - - if (rec==NULL) + + if (rec->suivant==NULL && rec->lettre!=c) { - printf("rech = NUll \n"); + + printf("rech suiv = NUll \n"); ajout_dico(&(arbre),&(rec),c); - arbre=rec->arbre; + // printf("ajout de : %c à %p et fils :%p\n", rec->lettre, rec, rec->fils); + arbre_prec=arbre; + arbre=rec->fils; } else {// Cas où le début du mot existe déjà et qu'on le complète - printf("rech pas null\n"); - arbre=rec->arbre; // On va à l'étage d'après pour former le mot dans l'arbre - // affiche_dico(arbre); + printf("rech suiv pas null rec lettre %c\n", rec->lettre); + arbre_prec=arbre; + arbre=rec->fils; // On va à l'étage d'après pour former le mot dans l'arbre + // } - // printf("lettre %c \n",arbre->lettre); + } } else { + printf("else\n"); + if (arbre_originel!=NULL) + { + printf("%c \n", arbre_prec->lettre); + arbre_prec->fin_mot=true; // Cette lettre est la dernière du mot + } + + affiche_dico(arbre_originel); printf("remise à 0\n"); - arbre=arbre_originel; + arbre=arbre_originel; // On revient en haut de l'arbre pour commencer un nouveau mot } - //arbre=arbre_originel; // On revient en haut de l'arbre pour commencer un nouveau mot + //arbre=arbre_originel; } - - + printf("arbre originel lettre %c \n", arbre_originel->fils->lettre); + affiche_dico(arbre_originel); + free_tree(&arbre); fclose(fp); diff --git a/dico.c~ b/dico.c~ new file mode 100644 index 0000000..317ea5d --- /dev/null +++ b/dico.c~ @@ -0,0 +1,95 @@ +#include +#include + + +typedef struct cell* ptarbre; +typedef struct cell* ptcellule; + +typedef struct cell { + int lettre; + ptarbre arbre; // Descend d'un étage dans le mot (lettre suivante du mot) + ptcellule suivant; // Lettre suivante stockée à l'étage arbre en (ieme position) +} cell; + +/* Pas utile +void init_dico() +{ + ptarbre arbre; + arbre=NULL; +} +*/ +ptarbre rech(ptarbre arbre, int lettre) +// recherche une lettre en ième position (correspondant à arbre) +// Retourne l'adresse de l'abre contenant la lettre à cette position +{ + while((arbre!=NULL) && (arbre->lettre != lettre)) + arbre=arbre->suivant; + return arbre; +} +void ajout_dico(ptarbre arbre, int lettre) +{ + arbre=malloc(sizeof(cell)); + arbre->lettre=lettre; + arbre->arbre=NULL; + arbre->suivant=NULL; +} + +void affiche_dico(ptarbre arbre) +// affiche tout le dictionnaire à partir de l'arbre (donc le numéro de lettre) sélectionné +{ + +} + + +int main() +{ + ptarbre arbre_originel,arbre; + arbre_originel=NULL; + arbre_originel=malloc(sizeof(cell)); + arbre=malloc(sizeof(cell)); + arbre->lettre = 0; + arbre->suivant = NULL; + arbre->arbre = NULL; + //arbre=arbre_originel; + char c; + // Ouvrir fichier + FILE *fp = fopen("words1","r"); + if (fp==NULL) + printf("words1 inaccessible ",fp); + else + printf("words1 accessible n",fp); + + while (fscanf(fp,"%d",&c)!= EOF) // lecture de tout le fichier + { + // while (fscanf(fp,"%d",&c)!='\n') // Tant que le mot n'est pas fini, on ajoute les lettres à la suite + // { + if (c != '\n') { + printf("%d\n", c); + if (rech(arbre,c)==NULL) // Cas où c'est un nouveau mot + { + ajout_dico(arbre,c); + } + else + { + while (rech(arbre,c)!=NULL) // Cas où le début du mot existe déjà et qu'on le complète + { + + arbre=rech(arbre,c)->arbre; // On va à l'étage d'après pour former le mot dans l'arbre + // affiche_dico(arbre); + } + // ajout_dico(arbre,c); + // printf("%c",arbre->lettre); + } + } + else { + arbre=arbre_originel; + } + //arbre=arbre_originel; // On revient en haut de l'arbre pour commencer un nouveau mot + } + + + fclose(fp); + + + return 0; +} diff --git a/projet b/projet new file mode 100755 index 0000000..a5ed736 Binary files /dev/null and b/projet differ diff --git a/words1.txt b/words1.txt new file mode 100644 index 0000000..e86c52d --- /dev/null +++ b/words1.txt @@ -0,0 +1,5 @@ + +voir + +voile +visage diff --git a/words1.txt~ b/words1.txt~ new file mode 100644 index 0000000..2a9e3d2 --- /dev/null +++ b/words1.txt~ @@ -0,0 +1,5 @@ + +voir +visage +voile + diff --git a/words1~ b/words1~ new file mode 100644 index 0000000..aa3f53e --- /dev/null +++ b/words1~ @@ -0,0 +1 @@ +voir \ No newline at end of file -- libgit2 0.21.2