d74431cd
grouille
Ajout de tree.c
|
1
2
3
4
|
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAX 30
|
54951130
grouille
Ajout du fichier ...
|
5
6
|
#define NB_CARAC 26
#define nb_car 5
|
d74431cd
grouille
Ajout de tree.c
|
7
8
9
10
11
|
typedef struct node* Node;
typedef struct node {
char letter;
|
54951130
grouille
Ajout du fichier ...
|
12
|
Node next[NB_CARAC];
|
d74431cd
grouille
Ajout de tree.c
|
13
14
15
|
bool endWord;
}node;
|
54951130
grouille
Ajout du fichier ...
|
16
|
bool is_empty_tree(Node Tree)
|
d74431cd
grouille
Ajout de tree.c
|
17
|
{
|
54951130
grouille
Ajout du fichier ...
|
18
|
return(Tree==NULL);
|
d74431cd
grouille
Ajout de tree.c
|
19
20
|
}
|
54951130
grouille
Ajout du fichier ...
|
21
|
bool is_leaf(Node Tree)
|
d74431cd
grouille
Ajout de tree.c
|
22
|
{
|
54951130
grouille
Ajout du fichier ...
|
23
24
25
26
|
for(int i=0; i<NB_CARAC; i++)
if(Tree->next[i] != NULL)
return false;
return true;
|
d74431cd
grouille
Ajout de tree.c
|
27
28
29
30
|
}
void init_tree(Node* Tree)
{
|
54951130
grouille
Ajout du fichier ...
|
31
|
if(is_empty_tree(*Tree))
|
d74431cd
grouille
Ajout de tree.c
|
32
|
{
|
54951130
grouille
Ajout du fichier ...
|
33
|
*Tree = malloc(sizeof(node));
|
d74431cd
grouille
Ajout de tree.c
|
34
35
|
(*Tree)->letter = '?';
(* Tree)->endWord = false;
|
54951130
grouille
Ajout du fichier ...
|
36
|
for(int i=0; i<NB_CARAC; i++)
|
d74431cd
grouille
Ajout de tree.c
|
37
38
39
40
|
(*Tree)->next[i] = NULL;
}
}
|
54951130
grouille
Ajout du fichier ...
|
41
|
void add_in_tree(Node Tree, char word[])
|
d74431cd
grouille
Ajout de tree.c
|
42
|
{
|
d74431cd
grouille
Ajout de tree.c
|
43
|
int j=0;
|
54951130
grouille
Ajout du fichier ...
|
44
45
|
Node Tree2 = Tree;
while(word[j] != '\0')
|
d74431cd
grouille
Ajout de tree.c
|
46
|
{
|
54951130
grouille
Ajout du fichier ...
|
47
48
|
if(is_leaf(Tree2))
printf("empty\t");
|
d74431cd
grouille
Ajout de tree.c
|
49
|
char letter = word[j];
|
54951130
grouille
Ajout du fichier ...
|
50
51
52
53
54
55
|
if(Tree2->next[letter-'a']!=NULL)
{
Tree2 = Tree2->next[letter-'a'];
printf("%c %d\t", letter, letter-'a');
printf("okA %d\n", j);
}
|
d74431cd
grouille
Ajout de tree.c
|
56
57
58
|
else
{
Node new = NULL;
|
54951130
grouille
Ajout du fichier ...
|
59
|
new = malloc(sizeof(node));
|
d74431cd
grouille
Ajout de tree.c
|
60
61
62
63
64
|
new->letter = letter;
for(int i=0; i<26; i++)
{
new->next[i]=NULL;
}
|
54951130
grouille
Ajout du fichier ...
|
65
|
Tree2->next[letter-'a'] = new;
|
12c9a42f
grouille
Modification du f...
|
66
67
|
if(!(Tree2->endWord))
Tree2->endWord = false;
|
54951130
grouille
Ajout du fichier ...
|
68
69
70
|
Tree2=Tree2->next[letter-'a'];
printf("%c %d\t", letter, letter-'a');
printf("okB %d\n", j);
|
d74431cd
grouille
Ajout de tree.c
|
71
72
|
}
j++;
|
54951130
grouille
Ajout du fichier ...
|
73
74
75
76
77
78
79
80
|
if(word[j]=='\0')
Tree2->endWord = true;
}
printf("ok\n");
}
bool is_end_caract(char letter)
{
|
12c9a42f
grouille
Modification du f...
|
81
82
|
if(letter==0) return true;
if((letter>=32 && letter<=47)||(letter>=58 && letter<=64)||(letter>=123 && letter<=126)||(letter==128)) return true;
|
54951130
grouille
Ajout du fichier ...
|
83
84
85
86
87
88
89
90
91
92
93
|
return false;
}
char max_index(char word[])
{
int index = 0;
while(!is_end_caract(word[index]))
index++;
return index;
}
|
12c9a42f
grouille
Modification du f...
|
94
|
void scan_word(Node Tree, char word[], int* error) // si un mot démarre juste après un caractère de fin, la fonction ne lit pas les mots séparément
|
54951130
grouille
Ajout du fichier ...
|
95
|
{
|
12c9a42f
grouille
Modification du f...
|
96
97
|
bool endWord;
bool stop = false;
|
54951130
grouille
Ajout du fichier ...
|
98
99
100
101
102
|
int ind = 0;
char letter;
Node Tree2 = Tree;
while(!is_end_caract(word[ind]))
{
|
12c9a42f
grouille
Modification du f...
|
103
|
stop = false;
|
54951130
grouille
Ajout du fichier ...
|
104
105
106
107
108
|
letter = word[ind];
if(Tree2->next[letter-'a']!=NULL)
{
ind++;
Tree2 = Tree2->next[letter-'a'];
|
12c9a42f
grouille
Modification du f...
|
109
110
|
endWord = Tree2->endWord;
if(endWord) printf("end :: %s ::\n", word);
|
54951130
grouille
Ajout du fichier ...
|
111
112
113
114
115
|
}
else
{
printf("mot : %s erreur :%c %d \n", word, word[ind], word[ind]);
(*error)++;
|
12c9a42f
grouille
Modification du f...
|
116
|
printf("%d\n", ind);
|
54951130
grouille
Ajout du fichier ...
|
117
|
ind = max_index(word);
|
12c9a42f
grouille
Modification du f...
|
118
119
|
printf("%d\n", ind);
stop = true;
|
d74431cd
grouille
Ajout de tree.c
|
120
|
}
|
54951130
grouille
Ajout du fichier ...
|
121
|
}
|
12c9a42f
grouille
Modification du f...
|
122
123
124
125
126
|
if(!endWord && !stop)
{
(*error)++;
printf("---%s---\n", word);
}
|
54951130
grouille
Ajout du fichier ...
|
127
128
129
130
131
132
133
134
135
136
137
|
}
void read_txt(FILE* fp, Node* Tree, int* error)
{
char word[MAX];
while(1)
{
if(fscanf(fp, "%s", word)!=1)
return;
scan_word(*Tree, word, error);
}
|
d74431cd
grouille
Ajout de tree.c
|
138
139
140
141
142
143
144
|
}
void read_lib(FILE* fp, Node* Tree)
{
char word[MAX];
while(1)
{
|
54951130
grouille
Ajout du fichier ...
|
145
146
147
148
149
|
if(fscanf(fp, "%s", word)!=1)
return;
printf("--%s--\n", word);
//fflush(stdout);
add_in_tree(*Tree, word);
|
d74431cd
grouille
Ajout de tree.c
|
150
151
152
153
154
|
}
}
void print_tree(Node Tree, int index)
{
|
54951130
grouille
Ajout du fichier ...
|
155
156
157
158
159
160
161
162
163
164
165
166
|
if(is_empty_tree(Tree))
return;
Node cpTree = NULL;
cpTree = Tree;
if(cpTree->next[index]==NULL && index<26)
{
print_tree(cpTree, index+1);
}
else if(index == 26)
{
return;
}
|
d74431cd
grouille
Ajout de tree.c
|
167
|
else
|
54951130
grouille
Ajout du fichier ...
|
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
|
{
printf("%c\n", (cpTree->next[index])->letter);
if((cpTree->next[index])->endWord)
{
printf("fin\n");
//print_tree(cpTree, 0);
return;
}
print_tree(cpTree->next[index], 0);
}
}
int find_index(Node tree)
{
Node cpTree = tree;
int index = 0;
while(cpTree->next[index]==NULL && index < NB_CARAC)
index++;
return index;
}
void print_first(Node Tree)
{
Node cpTree = Tree;
int index = 0;
|
12c9a42f
grouille
Modification du f...
|
193
|
while(!is_leaf(cpTree) || !(cpTree->endWord))
|
54951130
grouille
Ajout du fichier ...
|
194
195
196
|
{
index = find_index(cpTree);
printf("%c\n", (cpTree->next[index])->letter);
|
12c9a42f
grouille
Modification du f...
|
197
|
if(cpTree->next[index]->endWord) printf("fin\n");
|
54951130
grouille
Ajout du fichier ...
|
198
199
|
cpTree=cpTree->next[index];
}
|
d74431cd
grouille
Ajout de tree.c
|
200
201
202
203
|
}
int main(int argc, char *argv[])
{
|
54951130
grouille
Ajout du fichier ...
|
204
205
206
207
208
209
210
211
212
213
214
|
Node tree = NULL;
int error = 0;
FILE* fp_lib;
FILE* fp_txt;
fp_lib = fopen(argv[argc-2], "r");
fp_txt = fopen(argv[argc-1], "r");
init_tree(&tree);
read_lib(fp_lib, &tree);
read_txt(fp_txt, &tree, &error);
|
12c9a42f
grouille
Modification du f...
|
215
|
// printf("%p\n", tree);
|
54951130
grouille
Ajout du fichier ...
|
216
217
|
print_first(tree);
|
12c9a42f
grouille
Modification du f...
|
218
219
|
//printf("\n");
//print_tree(tree, 0);
|
54951130
grouille
Ajout du fichier ...
|
220
221
222
|
printf("erreurs : %d\n", error);
|
d74431cd
grouille
Ajout de tree.c
|
223
224
|
return 0;
}
|