Blame view

tree.c 3.85 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
66
67
68
69
  	  Tree2->next[letter-'a'] = new;
  	  Tree2->endWord = false;
  	  Tree2=Tree2->next[letter-'a'];
  	  printf("%c %d\t", letter, letter-'a');
  	  printf("okB %d\n", j);
d74431cd   grouille   Ajout de tree.c
70
71
  	}
        j++;
54951130   grouille   Ajout du fichier ...
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
        if(word[j]=='\0')
  	Tree2->endWord = true;
      }
    printf("ok\n");
  }
  
  bool is_end_caract(char letter)
  {
    int endCaract[nb_car] = {0, 44, 45, 46, 47}; // a remplir
    for(int i=0; i<nb_car; i++)
    {
      if(letter==endCaract[i])
        return true;
    }
    return false;
  }
  
  char max_index(char word[])
  {
    int index = 0;
    while(!is_end_caract(word[index]))
      index++;
    return index;
  }
  
  void scan_word(Node Tree, char word[], int* error) // ne gรจre pas les mots avec endWord = true
  {
    int ind = 0;
    char letter;
    Node Tree2 = Tree;
    while(!is_end_caract(word[ind]))
    {
      letter = word[ind];
      if(Tree2->next[letter-'a']!=NULL)
      {
        ind++;
        Tree2 = Tree2->next[letter-'a'];
      }
      else
      {
        printf("mot : %s erreur :%c %d \n", word, word[ind], word[ind]);
        (*error)++;
        ind = max_index(word);
d74431cd   grouille   Ajout de tree.c
115
      }
54951130   grouille   Ajout du fichier ...
116
117
118
119
120
121
122
123
124
125
126
127
    }
  }
  
  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
128
129
130
131
132
133
134
  }
  
  void read_lib(FILE* fp, Node* Tree)
  {
    char word[MAX];
    while(1)
      {
54951130   grouille   Ajout du fichier ...
135
136
137
138
139
        if(fscanf(fp, "%s", word)!=1)
  	return;
        printf("--%s--\n", word);
        //fflush(stdout);
        add_in_tree(*Tree, word);
d74431cd   grouille   Ajout de tree.c
140
141
142
143
144
      }
  }
  
  void print_tree(Node Tree, int index)
  {
54951130   grouille   Ajout du fichier ...
145
146
147
148
149
150
151
152
153
154
155
156
    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
157
    else
54951130   grouille   Ajout du fichier ...
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
      {
        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;
    while(!is_leaf(cpTree))
      {
        index = find_index(cpTree);
        printf("%c\n", (cpTree->next[index])->letter);
        cpTree=cpTree->next[index];
      }
d74431cd   grouille   Ajout de tree.c
189
190
191
192
  }
  
  int main(int argc, char *argv[])
  {
54951130   grouille   Ajout du fichier ...
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
    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);
  
    printf("%p\n", tree);
  
    print_first(tree);
    printf("\n");
    print_tree(tree, 0);
    
    printf("erreurs : %d\n", error);
  
    int endCaract[nb_car] = {0, 44, 45, 46, 47}; // a remplir
    for(int i=0; i<nb_car; i++)
    {
      printf("%c", endCaract[i]);
    }
d74431cd   grouille   Ajout de tree.c
217
218
    return 0;
  }