Blame view

tree.c 15.2 KB
293e356c   grouille   Version quasi déf...
1
2
3
4
5
6
  // --------------------------------------------------------
  // Projet IMA3 2019 - Lecture d'une bibliothèque
  // Décompte du nombre de fautes d'orthographe dans un texte
  // Normand Quentin & Rouillé Guillaume
  // --------------------------------------------------------
  
7d87f7e2   grouille   Makefile + complè...
7
  #include "tree.h"
d74431cd   grouille   Ajout de tree.c
8
  
293e356c   grouille   Version quasi déf...
9
  // Fonction permettant de savoir si la structure est vide
54951130   grouille   Ajout du fichier ...
10
  bool is_empty_tree(Node Tree)
d74431cd   grouille   Ajout de tree.c
11
  {
54951130   grouille   Ajout du fichier ...
12
    return(Tree==NULL);
d74431cd   grouille   Ajout de tree.c
13
14
  }
  
293e356c   grouille   Version quasi déf...
15
  // Fonction permettant de savoir si le tableau 'next' est un tableau de pointeurs NULL
54951130   grouille   Ajout du fichier ...
16
  bool is_leaf(Node Tree)
d74431cd   grouille   Ajout de tree.c
17
  {
54951130   grouille   Ajout du fichier ...
18
19
20
21
    for(int i=0; i<NB_CARAC; i++)
      if(Tree->next[i] != NULL)
        return false;
    return true;
d74431cd   grouille   Ajout de tree.c
22
23
  }
  
293e356c   grouille   Version quasi déf...
24
  // Initialisation de la structure accueillant le dictionnaire
d74431cd   grouille   Ajout de tree.c
25
26
  void init_tree(Node* Tree)
  {
54951130   grouille   Ajout du fichier ...
27
    if(is_empty_tree(*Tree))
d74431cd   grouille   Ajout de tree.c
28
      {
54951130   grouille   Ajout du fichier ...
29
        *Tree = malloc(sizeof(node));
1e4b8b9c   grouille   Code complet comm...
30
        (*Tree)->letter = 7; // caractère sans utilité
d74431cd   grouille   Ajout de tree.c
31
        (* Tree)->endWord = false;
54951130   grouille   Ajout du fichier ...
32
        for(int i=0; i<NB_CARAC; i++)
293e356c   grouille   Version quasi déf...
33
          (*Tree)->next[i] = NULL; // initialisation du tableau 'next' à un tableau de pointeurs NULL
d74431cd   grouille   Ajout de tree.c
34
      }
3ff0cab7   grouille   Correction d'une ...
35
  } 
d74431cd   grouille   Ajout de tree.c
36
  
293e356c   grouille   Version quasi déf...
37
  // Détermine l'indice de rangement dans le tableau 'next' du caractère 'letter'
1e4b8b9c   grouille   Code complet comm...
38
  int find_caract_indice(char letter)
293e356c   grouille   Version quasi déf...
39
  {
293e356c   grouille   Version quasi déf...
40
41
    if(letter>=97 && letter<=122) return letter-'a';
    if(letter>=65 && letter<=90) return letter-'A';
a4cfb0f6   grouille   Suppression d'un ...
42
43
    if(letter == 39) return 26; // l'apostrophe est placée en 27ème position
    else return -1;
293e356c   grouille   Version quasi déf...
44
45
46
  }
  
  // Fonction d'ajout d'un mot 'word' dans la structure 'tree' de type 'arbre indexé'
54951130   grouille   Ajout du fichier ...
47
  void add_in_tree(Node Tree, char word[])
d74431cd   grouille   Ajout de tree.c
48
  {
293e356c   grouille   Version quasi déf...
49
50
    int j=0; // indice du caractère dans le mot 'word'
    int ind; // indice du caractère dans le tableau 'next'
54951130   grouille   Ajout du fichier ...
51
    Node Tree2 = Tree;
293e356c   grouille   Version quasi déf...
52
    while(word[j] != '\0') // on parcourt tout le mot 'word'
d74431cd   grouille   Ajout de tree.c
53
      {
d74431cd   grouille   Ajout de tree.c
54
        char letter = word[j];
1e4b8b9c   grouille   Code complet comm...
55
56
57
        ind = find_caract_indice(letter); // on récupère l'indice de rangement de 'letter'
        
        if(Tree2->next[ind]!=NULL) // si le pointeur du tableau 'next' correspondant au caractère lu n'est pas NULL, on s'insère dans cette 'branche' de l'arbre indexé et on continue avec le caractère suivant
293e356c   grouille   Version quasi déf...
58
59
        {
          Tree2 = Tree2->next[ind];
293e356c   grouille   Version quasi déf...
60
61
62
63
64
        }
        else // sinon, on ajoute une nouvelle cellule de type 'struct node' et on y insère les informations concernant le caractères
        {
          Node new = NULL;
          new = malloc(sizeof(node));
1e4b8b9c   grouille   Code complet comm...
65
66
67
  	
          new->letter = letter;
          for(int i=0; i<NB_CARAC; i++)
293e356c   grouille   Version quasi déf...
68
69
70
            {
              new->next[i]=NULL;
            }
ffa95c23   grouille   Version finale sa...
71
  	new->endWord = false;
1e4b8b9c   grouille   Code complet comm...
72
  	
293e356c   grouille   Version quasi déf...
73
          Tree2->next[ind] = new;  // on fait pointé le tableau du caractère précédent vers cette cellule (vers ce caractère)
1e4b8b9c   grouille   Code complet comm...
74
          if(!(Tree2->endWord)) // si le caractère précédent n'est pas un caractère de fin, on lui donne la valeur 'false'
ffa95c23   grouille   Version finale sa...
75
            Tree2->endWord = false;
293e356c   grouille   Version quasi déf...
76
          Tree2=Tree2->next[ind]; // on se place au niveau du caractère suivant dans l'arbre indexé
293e356c   grouille   Version quasi déf...
77
        }
d74431cd   grouille   Ajout de tree.c
78
        j++;
293e356c   grouille   Version quasi déf...
79
80
        if(word[j]=='\0') // si le caractère suivant est la fin de la chaîne, on dit que le caractère précédent est un caractère de fin
          Tree2->endWord = true;
54951130   grouille   Ajout du fichier ...
81
      }
54951130   grouille   Ajout du fichier ...
82
83
  }
  
293e356c   grouille   Version quasi déf...
84
  // Fonction qui détermine si le caractère est un caractère de fin de mot (espace, ',', ';', '.', etc..)
54951130   grouille   Ajout du fichier ...
85
86
  bool is_end_caract(char letter)
  {
12c9a42f   grouille   Modification du f...
87
    if(letter==0) return true;
a4cfb0f6   grouille   Suppression d'un ...
88
    if((letter>=32 && letter<=38)||(letter>=40 && letter<=47)||(letter>=58 && letter<=64)||(letter>=123 && letter<=126)) return true;
54951130   grouille   Ajout du fichier ...
89
90
91
    return false;
  }
  
293e356c   grouille   Version quasi déf...
92
  // Renvoi l'indice maximum du mot 'word'
54951130   grouille   Ajout du fichier ...
93
94
95
96
97
98
99
100
  char max_index(char word[])
  {
    int index = 0;
    while(!is_end_caract(word[index]))
      index++;
    return index;
  }
  
1e4b8b9c   grouille   Code complet comm...
101
102
  // Fonction qui scanne les mots du fichier à vérifier et les analyse
  void scan_word(Node Tree, char word[], int* error, FILE* fp_txt, int* correct)
54951130   grouille   Ajout du fichier ...
103
  {
1e4b8b9c   grouille   Code complet comm...
104
105
106
107
    bool endWord = false; // true : le caractère est un caractère de fin, false : le caractère n'est pas un caractère de fin
    bool stop = false; // permet de ne pas compte 2 fois certaines erreurs
    int ind = 0; // indice dans le mot 'word'
    int indice; // indice de rangement de letter dans le tableau 'next'
54951130   grouille   Ajout du fichier ...
108
109
    char letter;
    Node Tree2 = Tree;
1e4b8b9c   grouille   Code complet comm...
110
    while(!is_end_caract(word[ind])) // si 'word[ind]' n'est pas un caractère de fin
54951130   grouille   Ajout du fichier ...
111
    {
12c9a42f   grouille   Modification du f...
112
      stop = false;
54951130   grouille   Ajout du fichier ...
113
      letter = word[ind];
1e4b8b9c   grouille   Code complet comm...
114
      indice = find_caract_indice(letter); // récupération de l'indice de rangement
293e356c   grouille   Version quasi déf...
115
      
1e4b8b9c   grouille   Code complet comm...
116
      if(Tree2 != NULL && Tree2->next[indice]!=NULL) // si l'arbre n'est pas vide et que la case correspondant à la lettre dans l'arbre n'est pas vide
54951130   grouille   Ajout du fichier ...
117
      {
1e4b8b9c   grouille   Code complet comm...
118
119
        ind++; // on passe à la lettre suivante
        Tree2 = Tree2->next[indice]; // on se met dans la case de la lettre qui vient dtre vérifiée
12c9a42f   grouille   Modification du f...
120
        endWord = Tree2->endWord;
54951130   grouille   Ajout du fichier ...
121
122
123
      }
      else
      {
1e4b8b9c   grouille   Code complet comm...
124
125
        add_error(error, word, ind, Tree2, fp_txt, correct); // si l'abre est vide ou que la case de l'arbre correspondant à la lettre est vide, on ajoute une erreur
        ind = max_index(word); // on se place à la fin du mot pour ne pas continuer de vérifier ses lettres
12c9a42f   grouille   Modification du f...
126
        stop = true;
7d87f7e2   grouille   Makefile + complè...
127
        endWord = false;
d74431cd   grouille   Ajout de tree.c
128
      }
54951130   grouille   Ajout du fichier ...
129
    }
1e4b8b9c   grouille   Code complet comm...
130
    if(!endWord && !stop) // si un mot manque d'au moins une lettre (endWord == false alors qu'on a atteint la fin du mot à scanner)
12c9a42f   grouille   Modification du f...
131
      {
1e4b8b9c   grouille   Code complet comm...
132
        add_error(error, word, ind, Tree2, fp_txt, correct); // on ajoute une erreur
12c9a42f   grouille   Modification du f...
133
      }
54951130   grouille   Ajout du fichier ...
134
135
  }
  
1e4b8b9c   grouille   Code complet comm...
136
  // Ajoute une erreur, donne le type d'erreur et lance le processus de correction
ffa95c23   grouille   Version finale sa...
137
  void add_error(int* error, char word[], int index, Node Tree, FILE* fp_txt, int* correct)
0e62ceb1   grouille   Code propre
138
139
  {
    (*error)++;
1e4b8b9c   grouille   Code complet comm...
140
    if(index==0) // si la première lettre n'est pas reconnu, on ne propose pas de correction
0e62ceb1   grouille   Code propre
141
      {
30391ee4   grouille   Correction légère
142
        printf("Le mot '%s' ne correspond à aucun mot du dictionnaire.\n\n", word);
0e62ceb1   grouille   Code propre
143
144
        return;
      }
a4cfb0f6   grouille   Suppression d'un ...
145
    else if(index<(int)strlen(word)) // si l'index d'erreur n'est pas le dernier indice du mot, on a une faute dans le mot
ffa95c23   grouille   Version finale sa...
146
        printf("Il y a une erreur dans le mot '%s', au caractère %c d'incide %d.\n", word, word[index], index);
1e4b8b9c   grouille   Code complet comm...
147
    else // sinon l'erreur a lieu à la fin du mot
ffa95c23   grouille   Version finale sa...
148
        printf("Il manque au moins une lettre au mot '%s'.\n", word);
1e4b8b9c   grouille   Code complet comm...
149
    make_correction(word, index, Tree, fp_txt, correct); // processus de correction
0e62ceb1   grouille   Code propre
150
151
  }
  
1e4b8b9c   grouille   Code complet comm...
152
153
  // Lance le processus de correction, avec les différentes initialisations
  void make_correction(char word[], int index, Node Tree, FILE* fp_txt, int* correct)
0e62ceb1   grouille   Code propre
154
  {
1e4b8b9c   grouille   Code complet comm...
155
156
157
158
159
160
161
162
163
164
165
166
167
    correction liste = NULL; // crée une liste contigüe qui contiendra les propositions de correction
    init_correction(&liste); // initalise cette liste
    char end; // permet de stocker un éventuel caractère de fin (',', ';', '?', etc..)
    bool testEnd; // true si le mot possede un caractère de fin, false sinon
    testEnd = detect_end_caract(&end, word);
    int longueur = strlen(word);
    Node Tree2 = Tree;
    word[index-1]='\0'; // on coupe le mot avant l'erreur
    printf("\n");
    char words[MAX] = ""; // chaine de caractères permettant le stockage des différentes lettres pouvant composer les mots de correction
    make_tree_correct(Tree2, 0, words, word, liste); // rempli la liste chainée avec les propositions de correction
    choice_word(liste, fp_txt, end, longueur, correct, testEnd); // permet le choix du mot de correction et lance le processus de remplacement
    free(liste);
ffa95c23   grouille   Version finale sa...
168
169
  }
  
1e4b8b9c   grouille   Code complet comm...
170
  // Détermine si le mot word possède un caractère de fin et le renvoie si c'est le cas
ffa95c23   grouille   Version finale sa...
171
172
  bool detect_end_caract(char* end, char word[])
  {
1e4b8b9c   grouille   Code complet comm...
173
174
175
176
177
178
    if(is_end_caract(word[strlen(word)-1]))
      {
        *end = word[strlen(word)-1];
        return true;
      }
    return false;
ffa95c23   grouille   Version finale sa...
179
180
  }
  
1e4b8b9c   grouille   Code complet comm...
181
  // Permet le choix du mot de correction et lance le processus de remplacement
ffa95c23   grouille   Version finale sa...
182
183
  void choice_word(correction liste, FILE* fp_txt, char end, int longueur, int* correct, bool testEnd)
  {
1e4b8b9c   grouille   Code complet comm...
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
    int choix;
    printf("Voici les mots possibles pour corriger ce mot :\n");
    for(int i=0; i<liste->dernier+1; i++) // on propose tous les mots de la liste contigüe
      printf("%d. %s\n", i+1, liste->mots[i]);
    printf("\n");
    choix = -1;
    printf("Quel mot voulez-vous sélectionner ? (Entrez %d pour ne pas corriger le mot)\n", (liste->dernier)+2); // exemple : 3 mots possibles. Si on entre 4, alors on ne veut pas corriger
    while(choix<1 || choix>liste->dernier+2) // vérifie que la valeur entrée est correcte
      {
        scanf("%d", &choix);
      }
    if(choix==(liste->dernier)+2) // si on ne corrige pas
      {
        printf("\n");
        return;
      }
    (*correct)++; // on incrémente un compteur de corrections
    char word[MAX]; // contiendra le mot choisi
    strcpy(word, liste->mots[choix-1]);
    printf("Le mot %s a été sélectionné.\n\n", word);
    if(testEnd) add_caract(word, end); // s'il y a un caractère de fin, on l'ajoute
    correct_word(word, fp_txt, longueur); // processus de remplacement
ffa95c23   grouille   Version finale sa...
206
207
  }
  
1e4b8b9c   grouille   Code complet comm...
208
  // Remplace le mot comportant une erreur par le mot choisi dans choice_word
ffa95c23   grouille   Version finale sa...
209
210
  void correct_word(char word[], FILE* fp_txt, int longueur)
  {
1e4b8b9c   grouille   Code complet comm...
211
212
213
    FILE* fp_tamp; // création d'un fichier tampon
    fp_tamp = fopen("tampon.txt", "w+"); // ouverture en mode lecture/écriture avec suppression du contenu au préalable
    if(fp_tamp==NULL)
ffa95c23   grouille   Version finale sa...
214
      {
1e4b8b9c   grouille   Code complet comm...
215
216
217
218
219
220
221
        printf("Erreur lors de l'ouverture du fichier tampon.\n");
        return;
      }
    int position = ftell(fp_txt)-longueur; // on récupère la position dans le fichier à analyser du début du mot avec erreur
    rewind(fp_txt); // on se place au début du fichier à scanner
    char tempo;
    while(ftell(fp_tamp)<position) // tant qu'on est pas arrivé au mot avec erreur
ffa95c23   grouille   Version finale sa...
222
      {
1e4b8b9c   grouille   Code complet comm...
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
        tempo = fgetc(fp_txt); // copie d'un caractère à la fois
        if(tempo==EOF) break; // jusque la fin du fichier
        fputc(tempo, fp_tamp); // on ajoute le caractère dans le fichier tampon
      }
    fprintf(fp_tamp, "%s", word); // on ajout le mot corrigé dans le fichier tampon
    long newPosition = ftell(fp_tamp); // on récupère la position de la fin du mot corrigé
    fseek(fp_txt, ftell(fp_txt)+longueur, SEEK_SET); // on se place après le mot avec erreur dans le fichier à analyser
    while(1) // on copie la fin du fichier à analyser dans le fichier tampon
      {
        tempo = fgetc(fp_txt);
        if(tempo==EOF) break;
        fputc(tempo, fp_tamp);
      }
    rewind(fp_txt); // on se remet au debut des 2 fichiers pour renvoyer le contenu du fichier tampon dans le fichier à analyser
    rewind(fp_tamp);
    char temp[MAX_READ];
    while(1) // on procède ligne par ligne car aucune modification sur un mot ne sera effectuée
      {
        if(fgets(temp, MAX_READ, fp_tamp)==NULL)
  	break;
        fputs(temp, fp_txt);
      }
    fseek(fp_txt, newPosition, SEEK_SET); // on avait récupérer la position après le mot corrigé, on s'y place pour continuer l'analyse du fichier
    fclose(fp_tamp); // fermeture du fichier tampon et suppression
    remove("tampon.txt");
ffa95c23   grouille   Version finale sa...
248
249
  }
  
1e4b8b9c   grouille   Code complet comm...
250
  // Initialise la liste contigüe contenant les mots de correction
ffa95c23   grouille   Version finale sa...
251
252
  void init_correction(correction* liste)
  {
1e4b8b9c   grouille   Code complet comm...
253
254
255
256
257
258
259
260
261
262
263
    if((*liste)!=NULL)
      {
        printf("Déjà initialisé.\n");
        return;
      }
    *liste = malloc(sizeof(struct liste));
    (*liste)->dernier = -1;
    for(int i=0; i<NB_MOT_CORRECTION; i++)
      {
        strcpy((*liste)->mots[i], "");
      }
0e62ceb1   grouille   Code propre
264
265
  }
  
1e4b8b9c   grouille   Code complet comm...
266
  // Affichage
0e62ceb1   grouille   Code propre
267
268
269
270
271
272
273
274
  void init_pgrm(void)
  {
    printf("\n------------------------------------------\n");
    printf("Correcteur ortographique.\n");
    printf("Normand Quentin & Rouillé Guillaume.\n");
    printf("------------------------------------------\n\n");
  }
  
1e4b8b9c   grouille   Code complet comm...
275
  // Renvoie true si 'word' ne comprend pas d'accent, false sinon
293e356c   grouille   Version quasi déf...
276
277
278
279
280
281
282
283
  bool no_accent(char word[])
  {
    int index_max = max_index(word);
    for(int i=0; i<index_max; i++)
      if(word[i]<0) return false;
    return true;
  }
  
1e4b8b9c   grouille   Code complet comm...
284
  // Lecture du fichier à analyser
ffa95c23   grouille   Version finale sa...
285
  void read_txt(FILE* fp, Node* Tree, int* error, int* correct)
54951130   grouille   Ajout du fichier ...
286
287
288
289
  {
    char word[MAX];
    while(1)
    {
1e4b8b9c   grouille   Code complet comm...
290
      if(fscanf(fp, "%s", word)!=1) // tant qu'on a pas fini la lecture du fichier
7d87f7e2   grouille   Makefile + complè...
291
        break;
1e4b8b9c   grouille   Code complet comm...
292
293
      if(no_accent(word)) // on ne prend pas en compte les mots accentués (voir compte-rendu pour explications)
        scan_word(*Tree, word, error, fp, correct); // on scanne le mot
54951130   grouille   Ajout du fichier ...
294
    }
0e62ceb1   grouille   Code propre
295
296
    if(feof(fp)) printf("Fin de la lecture du fichier à scanner.\n\n");
    if(ferror(fp)) printf("Erreur lors de la lecture du fichier à scanner.\n\n");
d74431cd   grouille   Ajout de tree.c
297
298
  }
  
1e4b8b9c   grouille   Code complet comm...
299
  // Lecture du dictionnaire
d74431cd   grouille   Ajout de tree.c
300
301
302
303
304
  void read_lib(FILE* fp, Node* Tree)
  {
    char word[MAX];
    while(1)
      {
1e4b8b9c   grouille   Code complet comm...
305
        if(fscanf(fp, "%s", word)!=1) // tant qu'on a pas fini la lecture du fichier
7d87f7e2   grouille   Makefile + complè...
306
  	break;
1e4b8b9c   grouille   Code complet comm...
307
308
        if(no_accent(word)) // on ne prend pas en compte les mots accentués (voir compte-rendu pour explications)
  	add_in_tree(*Tree, word); // on ajoute le mot dans l'arbre indexé
7d87f7e2   grouille   Makefile + complè...
309
      } 
0e62ceb1   grouille   Code propre
310
311
      if(feof(fp)) printf("Fin de la lecture de la bibliothèque.\n\n");
      if(ferror(fp)) printf("Erreur lors de la lecture de la  bibliothèque.\n\n");
d74431cd   grouille   Ajout de tree.c
312
313
  }
  
1e4b8b9c   grouille   Code complet comm...
314
  // Affichage de l'arbre indexé (inutile pour le code, fonction d'aide)
ffa95c23   grouille   Version finale sa...
315
316
  void print_tree(Node Tree, int index, char word[])
  {
1e4b8b9c   grouille   Code complet comm...
317
318
319
320
321
322
323
324
325
326
327
328
329
330
    if(is_empty_tree(Tree)) // si l'arbre est vide, rien a imprimer
      return;
    add_caract(word, Tree->letter); // sinon, on stocke le caractère dans une chaine
    if(is_leaf(Tree)) // si on atteint une feuille, on imprime et on supprime le dernier caractère car il n'est plus utile
      {
        printf("%s\n", word);
        supp_caract(word);
        return;
      }
    if(Tree->endWord) // si on est à la fin d'un mot, on l'imprime mais on enlève pas de lettre car il peut y avoir des mots plus grands de même racine
      printf("%s\n", word);
    while(index < NB_CARAC) // on parcourt tout le tableau de pointeur de chaque cellule
      {
        if(!is_empty_tree(Tree->next[index])) // si la case du tableau n'est pas vide
ffa95c23   grouille   Version finale sa...
331
  	{
1e4b8b9c   grouille   Code complet comm...
332
  	  print_tree(Tree->next[index], 0, word); // on relance la fonction en partant de la case
ffa95c23   grouille   Version finale sa...
333
  	}
1e4b8b9c   grouille   Code complet comm...
334
335
336
337
        index++;
      }
    supp_caract(word); // on supprime le dernier caractère stocké car il n'est plus utile
    return;
ffa95c23   grouille   Version finale sa...
338
  }
0e62ceb1   grouille   Code propre
339
  
1e4b8b9c   grouille   Code complet comm...
340
341
  // Comme son nom l'indique, cette fonction sélectionne les mots possibles pour la correction du mot 'word' et les ajoute dans la liste contigüe
  void make_tree_correct(Node Tree, int index, char word[], char start[], correction liste) // même principe que la fonction d'affichage de l'arbre indexé
d74431cd   grouille   Ajout de tree.c
342
  {
1e4b8b9c   grouille   Code complet comm...
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
    if(is_empty_tree(Tree)) // si l'arbre est vide, il n'y a pas de correction possible
      return;
    add_caract(word, Tree->letter); // on ajoute le caractère à la chaine de stockage
    if(is_leaf(Tree)) // si on arrive au bout d'une branche, on ajoute le mot dans la liste et on supprime le dernier caractère stocké
      {
        add_in_liste(liste, start, word);
        supp_caract(word);
        return;
      }
    if(Tree->endWord) // si on arrive à la fin d'un mot, on l'ajout dans la liste
      {
        add_in_liste(liste, start, word);
      }
    while(index < NB_CARAC) // on parcourt le tableau de chaque cellule
      {
        if(!is_empty_tree(Tree->next[index])) // si la case n'est pas vide
ffa95c23   grouille   Version finale sa...
359
  	{
1e4b8b9c   grouille   Code complet comm...
360
  	  make_tree_correct(Tree->next[index], 0, word, start, liste); // on relance la fonction à partir de cette case
ffa95c23   grouille   Version finale sa...
361
  	}
1e4b8b9c   grouille   Code complet comm...
362
363
364
365
        index++;
      }
    supp_caract(word); // on supprime le dernier caractère stocké, inutile maintenant
    return;
54951130   grouille   Ajout du fichier ...
366
367
  }
  
1e4b8b9c   grouille   Code complet comm...
368
  // Ajoute les mots de correction dans la liste contigüe
ffa95c23   grouille   Version finale sa...
369
  void add_in_liste(correction liste, char start[], char word[])
54951130   grouille   Ajout du fichier ...
370
  {
1e4b8b9c   grouille   Code complet comm...
371
372
373
374
375
376
377
378
    char temp[MAX];
    strcpy(temp, start); // on concatène le debut du mot (avant l'erreur) avec la suite envoyée dans 'word'
    strcat(temp, word);
    if(liste->dernier<NB_MOT_CORRECTION-1) // pour ne pas dépasser le nombre de mots proposés
      {
        (liste->dernier)++;
        strcpy(liste->mots[liste->dernier], temp);
      }
54951130   grouille   Ajout du fichier ...
379
380
  }
  
1e4b8b9c   grouille   Code complet comm...
381
  // Ajoute un caractère à une chaine de caractères
ffa95c23   grouille   Version finale sa...
382
  void add_caract(char word[], char caract)
54951130   grouille   Ajout du fichier ...
383
  {
ffa95c23   grouille   Version finale sa...
384
385
386
387
388
389
  	char str[2];
  	str[0] = caract;
  	str[1] = '\0';
  	strcat(word, str);
  }
  
1e4b8b9c   grouille   Code complet comm...
390
  // Supprime un caractère d'une chaine de caractères
ffa95c23   grouille   Version finale sa...
391
392
393
  void supp_caract(char word[])
  {
  	word[strlen(word)-1]='\0';
d74431cd   grouille   Ajout de tree.c
394
395
  }
  
1e4b8b9c   grouille   Code complet comm...
396
  // Désalloue la mémoire utilisée par l'arbre indexé
5db504f4   grouille   Ajout de la fonct...
397
  void free_tree(Node* Tree)
293e356c   grouille   Version quasi déf...
398
  {
5db504f4   grouille   Ajout de la fonct...
399
    if(*Tree!=NULL)
293e356c   grouille   Version quasi déf...
400
      {
5db504f4   grouille   Ajout de la fonct...
401
402
403
404
405
        for(int i=0; i<NB_CARAC; i++)
  	{
  	  free_tree(&(*Tree)->next[i]);
  	}
        free(*Tree);
293e356c   grouille   Version quasi déf...
406
      }
5db504f4   grouille   Ajout de la fonct...
407
  }
293e356c   grouille   Version quasi déf...