6394a205
vsalingu
Lecture du fichie...
|
1
2
|
#include <stdio.h>
#include <stdlib.h>
|
04b8ce94
vsalingu
Modification de l...
|
3
|
#include <stdbool.h>
|
73e92d24
vsalingu
Modifications de ...
|
4
|
#include <string.h>
|
6394a205
vsalingu
Lecture du fichie...
|
5
6
7
8
9
10
|
typedef struct cell* ptarbre;
typedef struct cell* ptcellule;
typedef struct cell {
|
fb82dc55
vsalingu
dico ok à vérifie...
|
11
|
char lettre;
|
04b8ce94
vsalingu
Modification de l...
|
12
|
ptarbre fils; // Descend d'un étage dans le mot (lettre suivante du mot)
|
6394a205
vsalingu
Lecture du fichie...
|
13
|
ptcellule suivant; // Lettre suivante stockée à l'étage arbre en (ieme position)
|
04b8ce94
vsalingu
Modification de l...
|
14
|
bool fin_mot;
|
6394a205
vsalingu
Lecture du fichie...
|
15
16
|
} cell;
|
253ecfa4
vsalingu
Dico ok vérifié g...
|
17
18
19
|
ptarbre rech(ptarbre arbre, char lettre)
// Fonction qui cherche une lettre passée en paramètre à partir d'une cellule à l'adresse arbre et qui retourne l'adresse d'une cellule, soit parce qu'il n'y a plus de cellules après, soit car c'est la cellule où se trouve la lettre passée en paramètre.
|
6394a205
vsalingu
Lecture du fichie...
|
20
|
{
|
04b8ce94
vsalingu
Modification de l...
|
21
|
if (arbre!=NULL)
|
6394a205
vsalingu
Lecture du fichie...
|
22
|
{
|
04b8ce94
vsalingu
Modification de l...
|
23
24
|
while ((arbre->suivant!=NULL) && (arbre->lettre != lettre))
{
|
04b8ce94
vsalingu
Modification de l...
|
25
|
arbre=(arbre->suivant);
|
04b8ce94
vsalingu
Modification de l...
|
26
|
}
|
6394a205
vsalingu
Lecture du fichie...
|
27
|
}
|
6394a205
vsalingu
Lecture du fichie...
|
28
29
|
return arbre;
}
|
d6caeeb7
vsalingu
fonction cons_arb...
|
30
31
|
void init_dico(ptarbre* parbre, char lettre)
|
253ecfa4
vsalingu
Dico ok vérifié g...
|
32
|
// Action qui initialise une cellule de type cell à l'adresse (*parbre) et qui ajoute à cette cellule la première lettre du texte, alloue de la mémoire pour le fils .
|
6394a205
vsalingu
Lecture du fichie...
|
33
|
{
|
fb82dc55
vsalingu
dico ok à vérifie...
|
34
|
(*parbre)=malloc(sizeof(cell));
|
04b8ce94
vsalingu
Modification de l...
|
35
|
(*parbre)->fils=malloc(sizeof(cell));
|
253ecfa4
vsalingu
Dico ok vérifié g...
|
36
|
(*parbre)->fils->lettre= '\0'; // Permet de savoir qu'il n'y a pas de lettre dans l'étage en dessous. Par exemple, si on est en train de construire le mot voir, avec 'v' et 'o' déjà dans l'arbre, arpès la lettre 'o' on met '\0' pour différencier s'il faut utiliser ajout tete ou ajout dico pour ajouter le 'i'.
|
d6caeeb7
vsalingu
fonction cons_arb...
|
37
38
39
40
41
42
|
(*parbre)->suivant=NULL;
(*parbre)->lettre=lettre;
(*parbre)->fin_mot=false;
}
void ajout_dico_tete(ptarbre *parbre, char lettre)
|
253ecfa4
vsalingu
Dico ok vérifié g...
|
43
|
// Action qui ajoute la première cellule d'un étage, utile pour le premier mot et pour les mots suivants qui sont plus longs que les précédents. Pour le premier mot 'voir', on utilise init_dico et pour les 3 autres lettres on utilise ajout_dico_tete. Ensuite, pour voile, on utilise ajout_dico pour 'v','o','i','l' et ajout_dico pour 'e'.
|
d6caeeb7
vsalingu
fonction cons_arb...
|
44
45
|
{
(*parbre)->fils=malloc(sizeof(cell));
|
04b8ce94
vsalingu
Modification de l...
|
46
|
(*parbre)->fils->suivant=NULL;
|
6394a205
vsalingu
Lecture du fichie...
|
47
|
(*parbre)->suivant=NULL;
|
fb82dc55
vsalingu
dico ok à vérifie...
|
48
|
(*parbre)->lettre=lettre;
|
04b8ce94
vsalingu
Modification de l...
|
49
|
(*parbre)->fin_mot=false;
|
6394a205
vsalingu
Lecture du fichie...
|
50
51
|
}
|
fb82dc55
vsalingu
dico ok à vérifie...
|
52
|
void ajout_dico(ptarbre *parbre, ptarbre *parbresuiv, char lettre)
|
253ecfa4
vsalingu
Dico ok vérifié g...
|
53
|
// Action qui ajoute une lettre dans un étage existant, en faisant le lien entre la cellule d'avant à l'adresse *parbre et la nouvelle cellule à l'adresse *parbresuiv en ajoutant la lettre passée en paramètre à la nouvelle cellule.
|
6394a205
vsalingu
Lecture du fichie...
|
54
|
{
|
fb82dc55
vsalingu
dico ok à vérifie...
|
55
56
|
*parbresuiv=malloc(sizeof(cell));
(*parbre)->suivant=*parbresuiv; // On relie la nouvelle lettre à l'avant dernière lettre
|
04b8ce94
vsalingu
Modification de l...
|
57
58
|
(*parbresuiv)->fils=malloc(sizeof(cell));
(*parbresuiv)->fils->suivant=NULL;
|
fb82dc55
vsalingu
dico ok à vérifie...
|
59
|
(*parbresuiv)->suivant=NULL;
|
04b8ce94
vsalingu
Modification de l...
|
60
|
(*parbresuiv)->fin_mot=false;
|
e475e825
vsalingu
Modifs fontion print
|
61
|
(*parbresuiv)->lettre=lettre;
|
6394a205
vsalingu
Lecture du fichie...
|
62
63
|
}
|
73e92d24
vsalingu
Modifications de ...
|
64
|
void affiche_dico(ptarbre arbre, int n_lettre, char mot[])
|
046e94d9
vsalingu
Code documenté ve...
|
65
|
// Action qui affiche tout le dictionnaire à partir de arbre (donc le numéro de lettre) sélectionné en stockant le début du mot qui est commun à tous les suivants dans mot initialisé à vide et le numéro de la lettre dans n_lettre initialisé à 0.
|
6394a205
vsalingu
Lecture du fichie...
|
66
|
{
|
04b8ce94
vsalingu
Modification de l...
|
67
68
69
70
71
72
|
if(arbre == NULL)
{
return;
}
else
{
|
73e92d24
vsalingu
Modifications de ...
|
73
|
if (arbre->fils != NULL)
|
04b8ce94
vsalingu
Modification de l...
|
74
|
{
|
73e92d24
vsalingu
Modifications de ...
|
75
76
|
mot[n_lettre]=arbre->lettre;
n_lettre++;
|
04b8ce94
vsalingu
Modification de l...
|
77
|
}
|
253ecfa4
vsalingu
Dico ok vérifié g...
|
78
79
80
81
82
|
if (arbre->fin_mot)
{
printf("%s",mot);
printf("\n");
}
|
e475e825
vsalingu
Modifs fontion print
|
83
|
|
e475e825
vsalingu
Modifs fontion print
|
84
|
affiche_dico(arbre->fils,n_lettre,mot);
|
73e92d24
vsalingu
Modifications de ...
|
85
86
|
if (arbre->suivant != NULL)
{
|
253ecfa4
vsalingu
Dico ok vérifié g...
|
87
88
|
n_lettre--;
mot[n_lettre]='\0';
|
73e92d24
vsalingu
Modifications de ...
|
89
|
}
|
e475e825
vsalingu
Modifs fontion print
|
90
|
affiche_dico(arbre->suivant, n_lettre, mot);
|
73e92d24
vsalingu
Modifications de ...
|
91
|
n_lettre--;
|
253ecfa4
vsalingu
Dico ok vérifié g...
|
92
|
mot[n_lettre]='\0';
|
73e92d24
vsalingu
Modifications de ...
|
93
|
|
253ecfa4
vsalingu
Dico ok vérifié g...
|
94
|
}
|
04b8ce94
vsalingu
Modification de l...
|
95
|
|
6394a205
vsalingu
Lecture du fichie...
|
96
|
}
|
04b8ce94
vsalingu
Modification de l...
|
97
98
|
void free_tree(cell **ptr_tree)
|
046e94d9
vsalingu
Code documenté ve...
|
99
|
// Action qui libère la mémoire allouée pour stockée les données du dictionnaire *(*ptr_tree).
|
04b8ce94
vsalingu
Modification de l...
|
100
|
{
|
046e94d9
vsalingu
Code documenté ve...
|
101
|
if ((*ptr_tree)==NULL)
|
04b8ce94
vsalingu
Modification de l...
|
102
103
104
105
106
107
108
109
110
111
112
|
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);
}
}
|
d6caeeb7
vsalingu
fonction cons_arb...
|
113
|
void cons_arbre(ptarbre *parbre_originel, ptarbre *parbre, ptarbre *parbre_prec, FILE* fp)
|
046e94d9
vsalingu
Code documenté ve...
|
114
|
// Action qui construit entièrement l'arbre, à partir du fichier fp, en partant de l'adresse parbre_originel qui correspond à la première cellule, parbre qui est la copie de l'arbre originel qui va nous permettre de nous balader entre les différentes lettres de chaque mot et de revenir à la première cellule à la fin de chaque mot.
|
d6caeeb7
vsalingu
fonction cons_arb...
|
115
|
{
|
eb0cebb1
vsalingu
Code sans fuites ...
|
116
|
char c;
|
d6caeeb7
vsalingu
fonction cons_arb...
|
117
|
ptarbre rec;
|
046e94d9
vsalingu
Code documenté ve...
|
118
|
while (fscanf(fp,"%c",&c)!= EOF) // Lecture de tout le fichier fp.
|
d6caeeb7
vsalingu
fonction cons_arb...
|
119
|
{
|
d6caeeb7
vsalingu
fonction cons_arb...
|
120
121
|
if (c != '\n')
{
|
046e94d9
vsalingu
Code documenté ve...
|
122
|
if ((*parbre_originel)==NULL) // Cas où c'est le premier mot et premiere lettre du dictionnaire.
|
d6caeeb7
vsalingu
fonction cons_arb...
|
123
|
{
|
046e94d9
vsalingu
Code documenté ve...
|
124
125
126
|
init_dico(parbre_originel,c);
(*parbre_prec)=(*parbre_originel); // On sauvegarde l'adresse de la lettre précédente.
(*parbre)=(*parbre_originel)->fils; // On passe à l'adresse de la cellule qui contiendra la prochaine lettre du même mot.
|
d6caeeb7
vsalingu
fonction cons_arb...
|
127
|
}
|
046e94d9
vsalingu
Code documenté ve...
|
128
|
else if ((*parbre)==NULL) // Cas où c'est le premier mot de l'arbre mais pas la première lettre.
|
d6caeeb7
vsalingu
fonction cons_arb...
|
129
|
{
|
d6caeeb7
vsalingu
fonction cons_arb...
|
130
|
init_dico(parbre,c);
|
e475e825
vsalingu
Modifs fontion print
|
131
|
(*parbre_prec)=(*parbre);
|
d6caeeb7
vsalingu
fonction cons_arb...
|
132
133
134
|
(*parbre)=(*parbre)->fils;
}
|
046e94d9
vsalingu
Code documenté ve...
|
135
|
else // Cas où ce n'est pas le premier mot, il faut faire une recherche parmi les lettres de même indice (donc à l'étage '(*parbre)') déjà enregistrées dans l'arbre.
|
d6caeeb7
vsalingu
fonction cons_arb...
|
136
|
{
|
d6caeeb7
vsalingu
fonction cons_arb...
|
137
|
rec=rech((*parbre),c);
|
046e94d9
vsalingu
Code documenté ve...
|
138
|
if (rec->lettre!=c) // Cas où la lettre présente dans la cellule à l'adresse renvoyée par rech((*parbre),c) n'est pas la lettre recherchée.
|
d6caeeb7
vsalingu
fonction cons_arb...
|
139
140
|
{
|
046e94d9
vsalingu
Code documenté ve...
|
141
|
if (rec==(*parbre) && rec->lettre=='\0') // Cas où il n'y a pas de lettres à l'indice *parbre donc la recherche renvoie l'adresse de la première cellule qui est vide.
|
d6caeeb7
vsalingu
fonction cons_arb...
|
142
|
{
|
d6caeeb7
vsalingu
fonction cons_arb...
|
143
|
ajout_dico_tete(parbre,c);
|
e475e825
vsalingu
Modifs fontion print
|
144
|
(*parbre_prec)=(*parbre);
|
d6caeeb7
vsalingu
fonction cons_arb...
|
145
146
147
|
(*parbre)=(*parbre)->fils;
}
|
046e94d9
vsalingu
Code documenté ve...
|
148
|
else if (rec->suivant==NULL && rec->lettre!='\0') // Cas où il y a qu'une lettre à l'indice *parbre donc la recherche renvoie l'adresse de la première cellule qui ne contient pas la lettre recherchée.
|
d6caeeb7
vsalingu
fonction cons_arb...
|
149
|
{
|
d6caeeb7
vsalingu
fonction cons_arb...
|
150
|
ajout_dico(&(rec),&(rec->suivant),c);
|
ac7caa18
vsalingu
Modification de l...
|
151
|
(*parbre_prec)=rec->suivant;
|
d6caeeb7
vsalingu
fonction cons_arb...
|
152
153
154
155
156
|
(*parbre)=rec->suivant->fils;
}
}
else
|
046e94d9
vsalingu
Code documenté ve...
|
157
|
{// Cas où la recherche renvoie l'adresse d'une cellule dont la lettre est la lettre recherchée donc le début du mot existe déjà et on le complète.
|
ac7caa18
vsalingu
Modification de l...
|
158
|
(*parbre_prec)=rec;
|
046e94d9
vsalingu
Code documenté ve...
|
159
|
(*parbre)=rec->fils; // On va à l'étage d'après pour former le mot dans l'arbre.
|
253ecfa4
vsalingu
Dico ok vérifié g...
|
160
|
|
d6caeeb7
vsalingu
fonction cons_arb...
|
161
162
163
164
165
|
}
}
}
|
046e94d9
vsalingu
Code documenté ve...
|
166
|
else { // Cas où c==\n donc le mot est terminé, il faut retourner en haut de l'arbre pour ajouter le prochain mot.
|
d6caeeb7
vsalingu
fonction cons_arb...
|
167
168
|
if ((*parbre_originel)!=NULL)
{
|
046e94d9
vsalingu
Code documenté ve...
|
169
|
(*parbre_prec)->fin_mot=true; // Cette lettre est la dernière du mot.
|
d6caeeb7
vsalingu
fonction cons_arb...
|
170
|
}
|
046e94d9
vsalingu
Code documenté ve...
|
171
|
(*parbre)=(*parbre_originel); // On revient en haut de l'arbre pour commencer un nouveau mot.
|
d6caeeb7
vsalingu
fonction cons_arb...
|
172
|
}
|
d6caeeb7
vsalingu
fonction cons_arb...
|
173
174
|
}
}
|
6394a205
vsalingu
Lecture du fichie...
|
175
176
177
|
int main()
{
|
e475e825
vsalingu
Modifs fontion print
|
178
|
char mot[30]="";
|
d6caeeb7
vsalingu
fonction cons_arb...
|
179
|
int n_lettre=0;
|
04b8ce94
vsalingu
Modification de l...
|
180
|
ptarbre arbre_originel,arbre,arbre_prec;
|
fb82dc55
vsalingu
dico ok à vérifie...
|
181
|
arbre_originel=NULL;
|
04b8ce94
vsalingu
Modification de l...
|
182
|
arbre=NULL;
|
6394a205
vsalingu
Lecture du fichie...
|
183
|
// Ouvrir fichier
|
253ecfa4
vsalingu
Dico ok vérifié g...
|
184
|
FILE *fp = fopen("words","r");
|
6394a205
vsalingu
Lecture du fichie...
|
185
|
if (fp==NULL)
|
eb0cebb1
vsalingu
Code sans fuites ...
|
186
|
printf("Dictionnaire inaccessible \n");
|
6394a205
vsalingu
Lecture du fichie...
|
187
|
else
|
eb0cebb1
vsalingu
Code sans fuites ...
|
188
|
printf("Dictionnaire accessible \n");
|
d6caeeb7
vsalingu
fonction cons_arb...
|
189
|
cons_arbre(&arbre_originel, &arbre, &arbre_prec,fp);
|
253ecfa4
vsalingu
Dico ok vérifié g...
|
190
|
affiche_dico(arbre_originel,n_lettre,mot);
|
eb0cebb1
vsalingu
Code sans fuites ...
|
191
|
free_tree(&arbre_originel);
|
6394a205
vsalingu
Lecture du fichie...
|
192
|
fclose(fp);
|
046e94d9
vsalingu
Code documenté ve...
|
193
|
|
6394a205
vsalingu
Lecture du fichie...
|
194
|
|
6394a205
vsalingu
Lecture du fichie...
|
195
196
|
return 0;
}
|