#include #include #include #include #define MAX_LETTRES 30 #define size 255 typedef struct node { char l; struct node * lettres[size]; bool fin_de_mot; } Node; bool is_empty(struct node *tree) { return tree==NULL; } void ajout(Node **N, char lettre) { Node *nouveau = malloc(sizeof(Node)); (*nouveau).l=lettre; (*nouveau).fin_de_mot=0; for (int i=0; ilettres[i]=NULL; *N = nouveau; } void ajout_alphab(Node ** pn, char * mot,int cpt) { Node * tmp= *pn; char lettre=mot[cpt]; int pos; pos=lettre; if (lettre>='A' && lettre <= 'Z') pos =lettre -'A'+'a'; if (lettre == '\0' || pos == 44 || pos == 46){ (*tmp).fin_de_mot=1; return; } if (tmp->lettres[pos] == NULL) { ajout(&tmp->lettres[pos],lettre); } cpt++; return ajout_alphab(&tmp->lettres[pos],mot,cpt); } Node * charger_arbre(Node ** Arbre, char * dico){ FILE * fp; char mot[MAX_LETTRES]; fp = fopen(dico,"r"); int i; while ((i = fscanf(fp,"%s",mot)) == 1){ ajout_alphab(Arbre,mot,0); } fclose(fp); return *Arbre; } void affichage_arbre(Node * Arbre) { if (is_empty(Arbre)){ printf("arbre vide \n"); return; } for (int i=0; ilettres[i] != NULL){ printf("%c -> %c \n",Arbre->l,Arbre->lettres[i]->l); affichage_arbre(Arbre->lettres[i]); } } if (Arbre->fin_de_mot) printf("fin de mot \n"); } void detruire_arbre(Node ** Arbre) { if (is_empty(*Arbre)) return; for (int i=0; ilettres[i]); } free(*Arbre); *Arbre=NULL; } void initialisation(Node ** Arbre){ Node *nouveau = malloc(sizeof(struct node)); (*nouveau).l='?'; (*nouveau).fin_de_mot=0; for (int i=0; ilettres[i] = NULL; *Arbre = nouveau;} int comparaison(Node ** pn, char * mot,int cpt,int * erreur) { char lettre=mot[cpt]; int pos = lettre ; if (lettre>='A' && lettre <= 'Z') pos =lettre -'A'+'a'; cpt++; if (lettre == '\0' || pos == 44 || pos == 46){ if((*pn)->fin_de_mot==0){ (*erreur)++; } return (*erreur); } if (lettre == '?' || lettre == '!' || lettre == ':' || lettre == ';') return (*erreur); if ((*pn)->lettres[pos] == NULL) { (*erreur)++; return (*erreur); } return comparaison(&(*pn)->lettres[pos],mot,cpt,erreur); } void test_erreur(Node * Dico,char * texte){ FILE * fp; int * erreur=malloc(sizeof(int)); (*erreur)=0; char mot[MAX_LETTRES]; fp = fopen(texte,"r"); int i; while ((i = fscanf(fp,"%s",mot)) == 1){ (*erreur)=comparaison(&Dico,mot,0,erreur); } if ((*erreur)==0 || (*erreur)==1 ) printf("%d erreur \n",(*erreur)); else printf("%d erreurs \n",(*erreur)); free(erreur); fclose(fp); }