Blame view

tree.c 1.98 KB
9cf06b18   mertz   debut_add_tree
1
  #include "tree.h"
f7d9ccda   mertz   ajout_libtree
2
  
9cf06b18   mertz   debut_add_tree
3
  void cons_tree(struct node ** ptr_tree, int 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
  
03168857   mertz   create tree op
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
  void add(struct node **tab_ptr_tree, char val[],int taille, int fl)
  {
    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]);
  	   trouve = 0;
  	}
        
        noeudtest = noeudtest->fils[trouve];//on jump au noeud suivant
      }
    noeudtest->fin = 1;
  
9cf06b18   mertz   debut_add_tree
47
  }
f7d9ccda   mertz   ajout_libtree
48
  
541fd894   mertz   on_avance_tree
49
50
51
52
53
54
55
56
57
58
59
  int size(char val[])
  {
    int cpt = 0;
    while(val[cpt]!='\0')
      {
        cpt++;
      }
    return cpt;
  }
  
  
03168857   mertz   create tree op
60
  void load_tree(FILE *fp, struct node **tab_ptr_tree)
9cf06b18   mertz   debut_add_tree
61
62
  {
    //fl (first letter)
541fd894   mertz   on_avance_tree
63
64
65
66
    char val[50];
    
    while(fscanf(fp, "%s",val)==1)
      {
03168857   mertz   create tree op
67
        int taille = size(val);
541fd894   mertz   on_avance_tree
68
69
        if(val[0]<97)val[0]+=32;
        val[0]-=97;
03168857   mertz   create tree op
70
        add(tab_ptr_tree,val,taille,(int)val[0]);
541fd894   mertz   on_avance_tree
71
72
73
74
75
      }
  
      //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
76
  }
f7d9ccda   mertz   ajout_libtree
77
  
7ab3be6b   Thorsieger   debut free
78
  void free_tree(struct node *ptr_tree)
9cf06b18   mertz   debut_add_tree
79
  {
7ab3be6b   Thorsieger   debut free
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
    for(int i=0;i<ptr_tree->nbr_fils;i++)
    {
      if(ptr_tree->fils[i]->nbr_fils!=0)free_tree(ptr_tree->fils[i]);
      free(ptr_tree->fils[i]);
    }
    //free(ptr_tree);
  }
  
  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]);
      }
    }
9cf06b18   mertz   debut_add_tree
97
  }