Blame view

tree.c 3.23 KB
9cf06b18   mertz   debut_add_tree
1
  #include "tree.h"
f7d9ccda   mertz   ajout_libtree
2
  
284154ca   Thorsieger   gestion des accents
3
  void cons_tree(struct node ** ptr_tree, wchar_t val)
f7d9ccda   mertz   ajout_libtree
4
  {
9cf06b18   mertz   debut_add_tree
5
6
7
8
9
10
    *ptr_tree = malloc(sizeof(struct node));
    (*ptr_tree)->val = val;
    (*ptr_tree)->fin = 0;
    (*ptr_tree)->nbr_fils=0;
    (*ptr_tree)->fils = malloc(sizeof(struct node*));
    (*ptr_tree)->fils[0]=NULL;
f7d9ccda   mertz   ajout_libtree
11
12
  }
  
9cf06b18   mertz   debut_add_tree
13
14
15
16
  void mk_empty_tree(struct node **ptr_tree)
  {
    *ptr_tree = NULL;
  }
f7d9ccda   mertz   ajout_libtree
17
  
9cf06b18   mertz   debut_add_tree
18
19
20
21
  int is_leaf(struct node *tree)
  {
    return tree->fin||tree->fils[0]==NULL;
  }
f7d9ccda   mertz   ajout_libtree
22
  
284154ca   Thorsieger   gestion des accents
23
  void add(struct node **tab_ptr_tree, wchar_t val[],int taille, int fl)
03168857   mertz   create tree op
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
  {
    if(tab_ptr_tree[fl]==NULL)cons_tree(&(tab_ptr_tree[fl]),val[0]+97);
    Node* noeudtest = tab_ptr_tree[fl];
    for(int i = 1;i<taille;i++)
      {
        int trouve = -1;
        for(int j=0;j<noeudtest->nbr_fils;j++)
  	{
  	  if(noeudtest->fils[j]->val==val[i])trouve=j;
  	}
        if(trouve==-1)
  	{	  
  	  //ajouter lettre
  	   noeudtest->nbr_fils++;
  	   noeudtest->fils = realloc(noeudtest->fils,(noeudtest->nbr_fils)*sizeof(struct node*));
  	   cons_tree(&(noeudtest->fils[(noeudtest->nbr_fils)-1]),val[i]);
aeb78bdf   mertz   correction fin de...
40
  	   trouve = noeudtest->nbr_fils-1;
03168857   mertz   create tree op
41
42
43
44
45
46
  	}
        
        noeudtest = noeudtest->fils[trouve];//on jump au noeud suivant
      }
    noeudtest->fin = 1;
  
9cf06b18   mertz   debut_add_tree
47
  }
f7d9ccda   mertz   ajout_libtree
48
  
284154ca   Thorsieger   gestion des accents
49
  int size(wchar_t val[])
541fd894   mertz   on_avance_tree
50
51
52
53
54
55
56
57
58
  {
    int cpt = 0;
    while(val[cpt]!='\0')
      {
        cpt++;
      }
    return cpt;
  }
  
89b9e3f8   Thorsieger   découpage d'un texte
59
  void toLowerCase(wchar_t mot[])
aeb78bdf   mertz   correction fin de...
60
  {
89b9e3f8   Thorsieger   découpage d'un texte
61
    for(int i=0;i<size(mot);i++)
aeb78bdf   mertz   correction fin de...
62
63
64
65
66
67
68
69
      {
        if(mot[i]<='Z' && mot[i]>='A')
  	{
  	  mot[i]+=32;
  	}
      }
  }
  
89b9e3f8   Thorsieger   découpage d'un texte
70
71
72
73
74
  void splitcarac(struct node **tab_ptr_tree,wchar_t message[])
  {
    if(message[0]<'a' || message[0]>'z')return;
  
    wchar_t *buffer;
76053da1   Thorsieger   update des fichiers
75
    wchar_t *token = wcstok(message, L" ,?;.:/!*+\\\"()=«»", &buffer);
89b9e3f8   Thorsieger   découpage d'un texte
76
77
78
    add(tab_ptr_tree,token,size(token),(int)message[0]-97);
    if(buffer!=NULL)splitcarac(tab_ptr_tree,buffer);
  }
541fd894   mertz   on_avance_tree
79
  
03168857   mertz   create tree op
80
  void load_tree(FILE *fp, struct node **tab_ptr_tree)
9cf06b18   mertz   debut_add_tree
81
82
  {
    //fl (first letter)
284154ca   Thorsieger   gestion des accents
83
    wchar_t val[50];
541fd894   mertz   on_avance_tree
84
    
284154ca   Thorsieger   gestion des accents
85
    while(fwscanf(fp, L"%ls",val)==1)
541fd894   mertz   on_avance_tree
86
      {
89b9e3f8   Thorsieger   découpage d'un texte
87
88
        toLowerCase(val);
        splitcarac(tab_ptr_tree,val);
541fd894   mertz   on_avance_tree
89
90
91
92
93
      }
  
      //On peut tester la bonne ou mauvaise terminaison de la lecture
      if(feof(fp))    printf("Fin normal de lecture\n");
      if(ferror(fp))  printf("ERREUR de lecture\n");
9cf06b18   mertz   debut_add_tree
94
  }
f7d9ccda   mertz   ajout_libtree
95
  
7ab3be6b   Thorsieger   debut free
96
  void free_tree(struct node *ptr_tree)
9cf06b18   mertz   debut_add_tree
97
  {
131759ee   Thorsieger   fin free arbre
98
99
100
    if(ptr_tree==NULL)return;
    if(ptr_tree->nbr_fils==0){free(ptr_tree->fils);return;}
    for(int i=(ptr_tree->nbr_fils)-1;i>=0;i--)
7ab3be6b   Thorsieger   debut free
101
    {
131759ee   Thorsieger   fin free arbre
102
      free_tree(ptr_tree->fils[i]);
7ab3be6b   Thorsieger   debut free
103
104
      free(ptr_tree->fils[i]);
    }
131759ee   Thorsieger   fin free arbre
105
    free(ptr_tree->fils);
7ab3be6b   Thorsieger   debut free
106
107
108
109
110
111
112
113
114
  }
  
  void free_dico(struct node **tab_ptr_tree)
  {
    for(int i=0;i<26;i++)
    {
      if(tab_ptr_tree[i]!=NULL)
      {
        free_tree(tab_ptr_tree[i]);
131759ee   Thorsieger   fin free arbre
115
        free(tab_ptr_tree[i]);
7ab3be6b   Thorsieger   debut free
116
117
      }
    }
9cf06b18   mertz   debut_add_tree
118
  }
76053da1   Thorsieger   update des fichiers
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
  
  /*Recherche dans le dictionnaire*/
  int find_mot(struct node **tab_ptr_tree,wchar_t mot[],int size,int fl)
  {
      if(size==1 && tab_ptr_tree[fl]!=NULL)
      {
          if(tab_ptr_tree[fl]->fin==0)return 1;
          else return 0;//vrais
      }
      if(size==1 && tab_ptr_tree[fl]==NULL)return 1;//faux
  
      struct node *ptr_node = tab_ptr_tree[fl];
      for(int i=1;i<size;i++)
      {
          if(ptr_node->nbr_fils==0)return 1;
          for(int k=0;k<(ptr_node->nbr_fils);k++)
          {
              if(ptr_node->fils[k]->val==mot[i])
              {
                  ptr_node=ptr_node->fils[k];
                  break;
              }
  	    else if(k+1==ptr_node->nbr_fils)return 1;
          }
      }
  
      if(ptr_node->fin==0)return 1;
      else return 0;
  }
  
  int find()
  {
      return 0;
  }