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>
|
974b1ae4
tvolleri
ajout des fichier...
|
5
|
#include "tree.h"
|
6394a205
vsalingu
Lecture du fichie...
|
6
7
|
|
6394a205
vsalingu
Lecture du fichie...
|
8
|
|
fb82dc55
vsalingu
dico ok à vérifie...
|
9
|
ptarbre rech(ptarbre arbre, char lettre)
|
974b1ae4
tvolleri
ajout des fichier...
|
10
|
// 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...
|
11
|
{
|
04b8ce94
vsalingu
Modification de l...
|
12
|
if (arbre!=NULL)
|
6394a205
vsalingu
Lecture du fichie...
|
13
|
{
|
04b8ce94
vsalingu
Modification de l...
|
14
15
|
while ((arbre->suivant!=NULL) && (arbre->lettre != lettre))
{
|
04b8ce94
vsalingu
Modification de l...
|
16
17
|
arbre=(arbre->suivant);
}
|
6394a205
vsalingu
Lecture du fichie...
|
18
19
20
|
}
return arbre;
}
|
974b1ae4
tvolleri
ajout des fichier...
|
21
22
23
|
void init_dico(ptarbre* parbre, char lettre)
// 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...
|
24
|
{
|
fb82dc55
vsalingu
dico ok à vérifie...
|
25
|
(*parbre)=malloc(sizeof(cell));
|
04b8ce94
vsalingu
Modification de l...
|
26
|
(*parbre)->fils=malloc(sizeof(cell));
|
974b1ae4
tvolleri
ajout des fichier...
|
27
28
29
30
31
32
33
34
35
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'.
(*parbre)->suivant=NULL;
(*parbre)->lettre=lettre;
(*parbre)->fin_mot=false;
}
void ajout_dico_tete(ptarbre *parbre, char lettre)
// 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'.
{
(*parbre)->fils=malloc(sizeof(cell));
|
04b8ce94
vsalingu
Modification de l...
|
37
|
(*parbre)->fils->suivant=NULL;
|
6394a205
vsalingu
Lecture du fichie...
|
38
|
(*parbre)->suivant=NULL;
|
fb82dc55
vsalingu
dico ok à vérifie...
|
39
|
(*parbre)->lettre=lettre;
|
04b8ce94
vsalingu
Modification de l...
|
40
|
(*parbre)->fin_mot=false;
|
6394a205
vsalingu
Lecture du fichie...
|
41
42
|
}
|
fb82dc55
vsalingu
dico ok à vérifie...
|
43
|
void ajout_dico(ptarbre *parbre, ptarbre *parbresuiv, char lettre)
|
974b1ae4
tvolleri
ajout des fichier...
|
44
|
// 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...
|
45
|
{
|
fb82dc55
vsalingu
dico ok à vérifie...
|
46
47
|
*parbresuiv=malloc(sizeof(cell));
(*parbre)->suivant=*parbresuiv; // On relie la nouvelle lettre à l'avant dernière lettre
|
04b8ce94
vsalingu
Modification de l...
|
48
49
|
(*parbresuiv)->fils=malloc(sizeof(cell));
(*parbresuiv)->fils->suivant=NULL;
|
fb82dc55
vsalingu
dico ok à vérifie...
|
50
|
(*parbresuiv)->suivant=NULL;
|
04b8ce94
vsalingu
Modification de l...
|
51
|
(*parbresuiv)->fin_mot=false;
|
fb82dc55
vsalingu
dico ok à vérifie...
|
52
|
(*parbresuiv)->lettre=lettre;
|
6394a205
vsalingu
Lecture du fichie...
|
53
54
|
}
|
73e92d24
vsalingu
Modifications de ...
|
55
|
void affiche_dico(ptarbre arbre, int n_lettre, char mot[])
|
974b1ae4
tvolleri
ajout des fichier...
|
56
|
// 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...
|
57
|
{
|
04b8ce94
vsalingu
Modification de l...
|
58
59
60
61
62
63
|
if(arbre == NULL)
{
return;
}
else
{
|
73e92d24
vsalingu
Modifications de ...
|
64
|
if (arbre->fils != NULL)
|
04b8ce94
vsalingu
Modification de l...
|
65
|
{
|
73e92d24
vsalingu
Modifications de ...
|
66
67
|
mot[n_lettre]=arbre->lettre;
n_lettre++;
|
04b8ce94
vsalingu
Modification de l...
|
68
|
}
|
974b1ae4
tvolleri
ajout des fichier...
|
69
70
71
72
73
74
75
|
if (arbre->fin_mot)
{
printf("%s",mot);
printf("\n");
}
affiche_dico(arbre->fils,n_lettre,mot);
|
73e92d24
vsalingu
Modifications de ...
|
76
77
|
if (arbre->suivant != NULL)
{
|
974b1ae4
tvolleri
ajout des fichier...
|
78
79
|
n_lettre--;
mot[n_lettre]='\0';
|
73e92d24
vsalingu
Modifications de ...
|
80
|
}
|
974b1ae4
tvolleri
ajout des fichier...
|
81
|
affiche_dico(arbre->suivant, n_lettre, mot);
|
73e92d24
vsalingu
Modifications de ...
|
82
|
n_lettre--;
|
974b1ae4
tvolleri
ajout des fichier...
|
83
|
mot[n_lettre]='\0';
|
73e92d24
vsalingu
Modifications de ...
|
84
|
|
974b1ae4
tvolleri
ajout des fichier...
|
85
|
}
|
04b8ce94
vsalingu
Modification de l...
|
86
|
|
6394a205
vsalingu
Lecture du fichie...
|
87
|
}
|
04b8ce94
vsalingu
Modification de l...
|
88
89
|
void free_tree(cell **ptr_tree)
|
974b1ae4
tvolleri
ajout des fichier...
|
90
|
// Action qui libère la mémoire allouée pour stockée les données du dictionnaire *(*ptr_tree).
|
04b8ce94
vsalingu
Modification de l...
|
91
|
{
|
974b1ae4
tvolleri
ajout des fichier...
|
92
|
if ((*ptr_tree)==NULL)
|
04b8ce94
vsalingu
Modification de l...
|
93
94
95
96
97
98
99
100
101
102
103
|
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);
}
}
|
974b1ae4
tvolleri
ajout des fichier...
|
104
105
|
void cons_arbre(ptarbre *parbre_originel, ptarbre *parbre, ptarbre *parbre_prec, FILE* fp)
// 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.
|
6394a205
vsalingu
Lecture du fichie...
|
106
|
{
|
974b1ae4
tvolleri
ajout des fichier...
|
107
|
char c;
|
fb82dc55
vsalingu
dico ok à vérifie...
|
108
|
ptarbre rec;
|
974b1ae4
tvolleri
ajout des fichier...
|
109
|
while (fscanf(fp,"%c",&c)!= EOF) // Lecture de tout le fichier fp.
|
6394a205
vsalingu
Lecture du fichie...
|
110
|
{
|
6394a205
vsalingu
Lecture du fichie...
|
111
112
|
if (c != '\n')
{
|
974b1ae4
tvolleri
ajout des fichier...
|
113
|
if ((*parbre_originel)==NULL) // Cas où c'est le premier mot et premiere lettre du dictionnaire.
|
6394a205
vsalingu
Lecture du fichie...
|
114
|
{
|
974b1ae4
tvolleri
ajout des fichier...
|
115
116
117
118
119
120
121
122
123
124
|
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.
}
else if ((*parbre)==NULL) // Cas où c'est le premier mot de l'arbre mais pas la première lettre.
{
init_dico(parbre,c);
(*parbre_prec)=(*parbre);
(*parbre)=(*parbre)->fils;
}
|
6394a205
vsalingu
Lecture du fichie...
|
125
|
|
974b1ae4
tvolleri
ajout des fichier...
|
126
|
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.
|
6394a205
vsalingu
Lecture du fichie...
|
127
|
{
|
974b1ae4
tvolleri
ajout des fichier...
|
128
129
|
rec=rech((*parbre),c);
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.
|
6394a205
vsalingu
Lecture du fichie...
|
130
|
{
|
974b1ae4
tvolleri
ajout des fichier...
|
131
132
133
134
135
136
137
138
139
140
141
142
143
144
|
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.
{
ajout_dico_tete(parbre,c);
(*parbre_prec)=(*parbre);
(*parbre)=(*parbre)->fils;
}
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.
{
ajout_dico(&(rec),&(rec->suivant),c);
(*parbre_prec)=rec->suivant;
(*parbre)=rec->suivant->fils;
}
|
fb82dc55
vsalingu
dico ok à vérifie...
|
145
|
}
|
fb82dc55
vsalingu
dico ok à vérifie...
|
146
147
|
else
|
974b1ae4
tvolleri
ajout des fichier...
|
148
149
150
151
|
{// 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.
(*parbre_prec)=rec;
(*parbre)=rec->fils; // On va à l'étage d'après pour former le mot dans l'arbre.
|
6394a205
vsalingu
Lecture du fichie...
|
152
|
}
|
fb82dc55
vsalingu
dico ok à vérifie...
|
153
|
|
04b8ce94
vsalingu
Modification de l...
|
154
|
|
6394a205
vsalingu
Lecture du fichie...
|
155
|
}
|
fb82dc55
vsalingu
dico ok à vérifie...
|
156
|
}
|
974b1ae4
tvolleri
ajout des fichier...
|
157
158
|
else { // Cas où c==\n donc le mot est terminé, il faut retourner en haut de l'arbre pour ajouter le prochain mot.
if ((*parbre_originel)!=NULL)
|
04b8ce94
vsalingu
Modification de l...
|
159
|
{
|
974b1ae4
tvolleri
ajout des fichier...
|
160
|
(*parbre_prec)->fin_mot=true; // Cette lettre est la dernière du mot.
|
04b8ce94
vsalingu
Modification de l...
|
161
|
}
|
974b1ae4
tvolleri
ajout des fichier...
|
162
|
(*parbre)=(*parbre_originel); // On revient en haut de l'arbre pour commencer un nouveau mot.
|
6394a205
vsalingu
Lecture du fichie...
|
163
|
}
|
6394a205
vsalingu
Lecture du fichie...
|
164
|
}
|
6394a205
vsalingu
Lecture du fichie...
|
165
|
}
|