Commit 253ecfa4c2a25c0d9227d6a727fb1c60ae8fbdc6

Authored by vsalingu
1 parent 04d73ac1

Dico ok vérifié grâce à la fonction d'affichage

Showing 1 changed file with 20 additions and 109 deletions   Show diff stats
... ... @@ -14,99 +14,43 @@ typedef struct cell {
14 14 bool fin_mot;
15 15 } cell;
16 16  
17   -/* Pas utile
18   -void init_dico()
19   -{
20   - ptarbre arbre;
21   - arbre=NULL;
22   -}
23   -*/
24   -ptarbre rech(ptarbre arbre_ori, char lettre)
25   -// recherche une lettre en ième position (correspondant à arbre)
26   -// Retourne l'adresse de l'arbre contenant la lettre à cette position
  17 +
  18 +ptarbre rech(ptarbre arbre, char lettre)
  19 +// 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.
27 20 {
28   - ptarbre arbre;
29   - arbre=arbre_ori;
30   - printf("rech adr abre deb %p \n", arbre);
31 21 if (arbre!=NULL)
32 22 {
33   - printf("arbre lettre %c \n", arbre->lettre);
34 23 while ((arbre->suivant!=NULL) && (arbre->lettre != lettre))
35 24 {
36   - printf("lettre : %c lettre cherchee : %c adr arbre %p \n", arbre->lettre,lettre, arbre);
37 25 arbre=(arbre->suivant);
38   - printf("adr arbre while %p \n", arbre);
39 26 }
40 27 }
41   - printf("retourne adr %p lettre %c\n", arbre, arbre->lettre);
42 28 return arbre;
43 29 }
44   -void print_tout(struct cell *arbre, int cpt, char *debut_mot)
45   -{
46   - //Return si aucune lettre stockée
47   - if(arbre==NULL){
48   - return;
49   - }
50   -
51   - printf("%c", arbre->lettre);
52   -
53   -
54   - //Si fin de mot, retour à la ligne
55   - if(arbre->fin_mot == true){
56   - printf("\n");
57   -
58   - //Si fin de mot mais encore des lettres dans 'Son' (-> merci mercier), on affiche la base commune
59   - if (arbre->fils != NULL){
60   - debut_mot[cpt] = arbre->lettre;
61   - printf("%s", debut_mot);
62   - }
63   - }
64   -
65   - //On avance dans Son, on stock la lettre dans début_mot
66   - debut_mot[cpt] = arbre->lettre;
67   - cpt ++;
68   -
69   -
70   - //On print Son
71   - print_tout(arbre->fils, cpt, debut_mot);
72   -
73   - //On remonte l'arbre, on enleve une lettre de la racine commune
74   - cpt --;
75   - debut_mot[cpt] = '\0';
76   -
77   -
78   - //Si lettre dans arbre Brother -> nouveau mot -> Retour à la ligne (changement de mot)
79   - if(arbre->suivant != NULL){
80   -
81   - //On imprime alors la racine commune
82   - printf("%s", debut_mot);
83   - }
84   -
85   - //On print
86   - print_tout(arbre->suivant, cpt, debut_mot);
87   -}
88 30  
89 31 void init_dico(ptarbre* parbre, char lettre)
  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 .
90 33 {
91 34 (*parbre)=malloc(sizeof(cell));
92 35 (*parbre)->fils=malloc(sizeof(cell));
93   - (*parbre)->fils->lettre= '\0'; // Permet de savoir qu'il n'y a pas de lettre dans l'étage en dessous pour différencier s'il faut utiliser ajout tete ou ajout dico
  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'.
94 37 (*parbre)->suivant=NULL;
95 38 (*parbre)->lettre=lettre;
96 39 (*parbre)->fin_mot=false;
97 40 }
98 41  
99 42 void ajout_dico_tete(ptarbre *parbre, char lettre)
  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'.
100 44 {
101 45 (*parbre)->fils=malloc(sizeof(cell));
102 46 (*parbre)->fils->suivant=NULL;
103 47 (*parbre)->suivant=NULL;
104 48 (*parbre)->lettre=lettre;
105 49 (*parbre)->fin_mot=false;
106   - printf("ajout dico tete adr %p\n",(* parbre));
107 50 }
108 51  
109 52 void ajout_dico(ptarbre *parbre, ptarbre *parbresuiv, char lettre)
  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.
110 54 {
111 55 *parbresuiv=malloc(sizeof(cell));
112 56 (*parbre)->suivant=*parbresuiv; // On relie la nouvelle lettre à l'avant dernière lettre
... ... @@ -115,7 +59,6 @@ void ajout_dico(ptarbre *parbre, ptarbre *parbresuiv, char lettre)
115 59 (*parbresuiv)->suivant=NULL;
116 60 (*parbresuiv)->fin_mot=false;
117 61 (*parbresuiv)->lettre=lettre;
118   - printf("ajout lettre : %c à %p \n",(*parbresuiv)->lettre, parbresuiv);
119 62 }
120 63  
121 64 void affiche_dico(ptarbre arbre, int n_lettre, char mot[])
... ... @@ -132,21 +75,23 @@ void affiche_dico(ptarbre arbre, int n_lettre, char mot[])
132 75 mot[n_lettre]=arbre->lettre;
133 76 n_lettre++;
134 77 }
  78 + if (arbre->fin_mot)
  79 + {
  80 + printf("%s",mot);
  81 + printf("\n");
  82 + }
135 83  
136   - printf("%c",arbre->lettre);
137 84 affiche_dico(arbre->fils,n_lettre,mot);
138   - if (arbre->fin_mot)
139   - printf("\n");
140 85 if (arbre->suivant != NULL)
141 86 {
142   - printf("%s",mot);
143   - // mot[n_lettre]=arbre->lettre;
  87 + n_lettre--;
  88 + mot[n_lettre]='\0';
144 89 }
145 90 affiche_dico(arbre->suivant, n_lettre, mot);
146   - mot[n_lettre]='\0';
147 91 n_lettre--;
  92 + mot[n_lettre]='\0';
148 93  
149   - }
  94 + }
150 95  
151 96 }
152 97  
... ... @@ -164,18 +109,6 @@ void free_tree(cell **ptr_tree)
164 109 }
165 110 }
166 111  
167   -void print_suiv(ptarbre arbre)
168   -{
169   - if (arbre!=NULL)
170   - {
171   - while(arbre->suivant!=NULL)
172   - {printf("-%c_", arbre->lettre);
173   - arbre=arbre->suivant;
174   - }
175   - }
176   - printf("\n");
177   -}
178   -
179 112 void cons_arbre(ptarbre *parbre_originel, ptarbre *parbre, ptarbre *parbre_prec, FILE* fp)
180 113 {
181 114  
... ... @@ -183,20 +116,16 @@ void cons_arbre(ptarbre *parbre_originel, ptarbre *parbre, ptarbre *parbre_prec,
183 116 ptarbre rec;
184 117 while (fscanf(fp,"%c",&c)!= EOF) // lecture de tout le fichier
185 118 {
186   - printf("c= %c \n",c);
187 119 if (c != '\n')
188 120 {
189 121 if ((*parbre_originel)==NULL) // Cas où c'est le premier mot premiere lettre
190 122 {
191   - printf("arbre ori =NULL \n");
192   - init_dico(parbre_originel,c);
193   - printf("lettre arbre :%c \n",(*parbre_originel)->lettre);
  123 + init_dico(parbre_originel,c);;
194 124 (*parbre_prec)=(*parbre_originel);
195 125 (*parbre)=(*parbre_originel)->fils;
196 126 }
197 127 else if ((*parbre)==NULL) // premier mot de l'arbre
198 128 {
199   - printf("arbre null\n");
200 129 init_dico(parbre,c);
201 130 (*parbre_prec)=(*parbre);
202 131 (*parbre)=(*parbre)->fils;
... ... @@ -204,15 +133,12 @@ void cons_arbre(ptarbre *parbre_originel, ptarbre *parbre, ptarbre *parbre_prec,
204 133  
205 134 else // Cas où le dico n'est pas vide
206 135 {
207   - // printf("lettre arbre :%c \n",arbre->lettre);
208   - printf(" dico pas vide c: %c\n", c);
209 136 rec=rech((*parbre),c);
210 137 if (rec->lettre!=c)
211 138 {
212 139  
213 140 if (rec==(*parbre) && rec->lettre=='\0') // 1ere lettre de la liste
214 141 {
215   - printf("1ere lettre\n");
216 142 ajout_dico_tete(parbre,c);
217 143 (*parbre_prec)=(*parbre);
218 144 (*parbre)=(*parbre)->fils;
... ... @@ -220,11 +146,7 @@ void cons_arbre(ptarbre *parbre_originel, ptarbre *parbre, ptarbre *parbre_prec,
220 146  
221 147 else if (rec->suivant==NULL && rec->lettre!='\0')
222 148 {
223   -
224   - printf("rech suiv = NUll \n");
225 149 ajout_dico(&(rec),&(rec->suivant),c);
226   -
227   - // printf("ajout de : %c à %p et fils :%p\n", rec->lettre, rec, rec->fils);
228 150 (*parbre_prec)=(*parbre);
229 151 (*parbre)=rec->suivant->fils;
230 152 }
... ... @@ -232,31 +154,21 @@ void cons_arbre(ptarbre *parbre_originel, ptarbre *parbre, ptarbre *parbre_prec,
232 154  
233 155 else
234 156 {// Cas où le début du mot existe déjà et qu'on le complète
235   - //printf("rech lettre =lettre rec lettre %c rec lettre fils %c%c\n", rec->lettre, rec->fils->lettre);
236   - printf("lettre trouvee %c\n", rec->lettre);
237 157 (*parbre_prec)=(*parbre);
238 158 (*parbre)=rec->fils; // On va à l'étage d'après pour former le mot dans l'arbre
239   - //
  159 +
240 160 }
241 161  
242 162  
243 163 }
244 164 }
245 165 else {
246   - printf("c==n \n");
247 166 if ((*parbre_originel)!=NULL)
248 167 {
249   - printf("adr arbre prec %p et lettre %c \n", (*parbre_prec),(*parbre_prec)->lettre);
250 168 (*parbre_prec)->fin_mot=true; // Cette lettre est la dernière du mot
251 169 }
252   - // affiche_dico((*parbre_originel),n_lettre,mot);
253   - printf("remise à 0\n");
254   - print_suiv((*parbre));
255   - printf("avant egal arbre %p arbre ori %p \n", (*parbre), (*parbre_originel));
256 170 (*parbre)=(*parbre_originel); // On revient en haut de l'arbre pour commencer un nouveau mot
257   - printf("apres egal arbre %p arbre ori %p \n", (*parbre), (*parbre_originel));
258 171 }
259   - //arbre=arbre_originel;
260 172 }
261 173 }
262 174  
... ... @@ -268,14 +180,13 @@ int main()
268 180 arbre_originel=NULL;
269 181 arbre=NULL;
270 182 // Ouvrir fichier
271   - FILE *fp = fopen("words1.txt","r");
  183 + FILE *fp = fopen("words","r");
272 184 if (fp==NULL)
273 185 printf("words1 inaccessible \n",fp);
274 186 else
275 187 printf("words1 accessible \n",fp);
276 188 cons_arbre(&arbre_originel, &arbre, &arbre_prec,fp);
277   - //affiche_dico(arbre_originel,n_lettre,mot);
278   - print_tout(arbre_originel,n_lettre, mot);
  189 + affiche_dico(arbre_originel,n_lettre,mot);
279 190 free_tree(&arbre);
280 191 fclose(fp);
281 192  
... ...