Blame view

tree.c 4.18 KB
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;
  }