Blame view

tree.c 2.85 KB
9cf06b18   mertz   debut_add_tree
1
  #include "tree.h"
f7d9ccda   mertz   ajout_libtree
2
3
4
5
  
  /*
  typedef struct node {
  	int val;
9cf06b18   mertz   debut_add_tree
6
  	int fin;
f7d9ccda   mertz   ajout_libtree
7
  	struct node* fils[];
9cf06b18   mertz   debut_add_tree
8
  	int nbr_fils;
f7d9ccda   mertz   ajout_libtree
9
  }Node, *PtNode, *Tree;
9cf06b18   mertz   debut_add_tree
10
11
12
13
14
15
16
17
18
19
20
  
  #include <stdio.h>
  #include <stdlib.h>
  
  int main(){
    int tmp;
    tmp = getchar();
    printf("%d\n",tmp);
    return 0;
  }
  
f7d9ccda   mertz   ajout_libtree
21
22
   */
  
9cf06b18   mertz   debut_add_tree
23
  void cons_tree(struct node ** ptr_tree, int val)
f7d9ccda   mertz   ajout_libtree
24
  {
9cf06b18   mertz   debut_add_tree
25
26
27
28
29
30
    *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
31
    
9cf06b18   mertz   debut_add_tree
32
33
    //(*ptr_tree)->fils = realloc(sizeof(struct node*)*nbr_fils);
    //(*ptr_tree)->fils[nbr_fils];
f7d9ccda   mertz   ajout_libtree
34
35
  }
  
9cf06b18   mertz   debut_add_tree
36
37
38
39
  void mk_empty_tree(struct node **ptr_tree)
  {
    *ptr_tree = NULL;
  }
f7d9ccda   mertz   ajout_libtree
40
  
9cf06b18   mertz   debut_add_tree
41
42
43
44
  int is_leaf(struct node *tree)
  {
    return tree->fin||tree->fils[0]==NULL;
  }
f7d9ccda   mertz   ajout_libtree
45
  
03168857   mertz   create tree op
46
  /*void add(struct node **tab_ptr_tree, char val[],int taille, int fl)
9cf06b18   mertz   debut_add_tree
47
  {
03168857   mertz   create tree op
48
    Node* node =  tab_ptr_tree[fl];
9cf06b18   mertz   debut_add_tree
49
50
    for(int i=0;i<taille;i++)
    {
541fd894   mertz   on_avance_tree
51
52
      if(node==NULL){
        node = malloc(sizeof(struct node));
03168857   mertz   create tree op
53
54
55
56
57
        cons_tree(&node,val[i]);
        printf("%d",node->val);
        tab_ptr_tree[fl] = node;
        continue;
    
541fd894   mertz   on_avance_tree
58
59
      }
      int trouve = -1;
03168857   mertz   create tree op
60
      for(int j=0;j<(node)->nbr_fils;j++)
9cf06b18   mertz   debut_add_tree
61
      {
03168857   mertz   create tree op
62
        if((node)->fils[j]->val==val[i])
9cf06b18   mertz   debut_add_tree
63
        {
541fd894   mertz   on_avance_tree
64
  	trouve=j;
9cf06b18   mertz   debut_add_tree
65
66
67
  	break;
        }
      }
541fd894   mertz   on_avance_tree
68
69
      if(trouve == -1)
      {//ajouter fils
03168857   mertz   create tree op
70
71
72
        (node)->nbr_fils++;
        (node)->fils = realloc((node)->fils,((node)->nbr_fils)*sizeof(struct node*));
        cons_tree(&((node)->fils[((node)->nbr_fils)-1]),val[i]);
541fd894   mertz   on_avance_tree
73
        trouve = 0;
9cf06b18   mertz   debut_add_tree
74
      }
03168857   mertz   create tree op
75
      node = (node)->fils[trouve];
541fd894   mertz   on_avance_tree
76
77
      if(i==taille-1)
        {
03168857   mertz   create tree op
78
  	(node)->fin=1;
541fd894   mertz   on_avance_tree
79
        }
9cf06b18   mertz   debut_add_tree
80
81
82
    }
    //mettre fin à 1 pour le bon
    //if(i==taille-1)(*(tab_ptr_tree[fl]))->fin=1; //
03168857   mertz   create tree op
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
    }*/
  
  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
109
  }
f7d9ccda   mertz   ajout_libtree
110
  
541fd894   mertz   on_avance_tree
111
112
113
114
115
116
117
118
119
120
121
  int size(char val[])
  {
    int cpt = 0;
    while(val[cpt]!='\0')
      {
        cpt++;
      }
    return cpt;
  }
  
  
03168857   mertz   create tree op
122
  void load_tree(FILE *fp, struct node **tab_ptr_tree)
9cf06b18   mertz   debut_add_tree
123
124
  {
    //fl (first letter)
541fd894   mertz   on_avance_tree
125
126
127
128
    char val[50];
    
    while(fscanf(fp, "%s",val)==1)
      {
03168857   mertz   create tree op
129
        int taille = size(val);
541fd894   mertz   on_avance_tree
130
131
        if(val[0]<97)val[0]+=32;
        val[0]-=97;
03168857   mertz   create tree op
132
        add(tab_ptr_tree,val,taille,(int)val[0]);
541fd894   mertz   on_avance_tree
133
134
135
136
137
      }
  
      //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
138
  }
f7d9ccda   mertz   ajout_libtree
139
  
9cf06b18   mertz   debut_add_tree
140
141
142
143
  void free_tree(struct node **ptr_tree)
  {
    
  }