01: #include<stdio.h>
02: #include<stdlib.h>
03: 
04: struct elemento // singolo elemento ovvero i dati di una singola riga
05: {
06:   char nome[201]; // 200 caratteri e fine stringa
07:   int rgt, lft;
08: };
09: 
10: struct gerarchia // contiene array con i dati di tutte le righe e quante ne ho
11: {
12:   struct elemento nodi[100];
13:   int num_nodi;
14: };
15: 
16: int find_next_sibling(const struct gerarchia tree, const int index);
17: int find_first_son(const struct gerarchia tree, const int index);
18: void print_hierarchy(const struct gerarchia tree, const int index, const int level);
19: 
20: int main(int argc, char **argv){
21: 
22:   FILE *fp=fopen("nested2.csv", "r");
23:   if(!fp)
24:   {
25:     perror("");
26:     exit(EXIT_FAILURE);
27:   }
28:   
29:   struct gerarchia tree;
30:   tree.num_nodi=0;
31: 
32:   while(fscanf(fp, " %[^;];%d;%d", tree.nodi[tree.num_nodi].nome, &tree.nodi[tree.num_nodi].lft, &tree.nodi[tree.num_nodi].rgt) == 3) // devo leggere una stringa fino al primo ";", saltare il ";" e leggere due numeri separati da ";"
33:   {
34:     tree.num_nodi++;
35:   }
36: 
37:   fclose(fp);
38: 
39:   print_hierarchy(tree, 0, 0);
40: 
41:   return 0;
42: }
43: 
44: int find_next_sibling(const struct gerarchia tree, const int index){
45:   int i;
46: 
47:   for(i=0; i<tree.num_nodi; ++i)
48:   {
49:     if(tree.nodi[i].lft == (tree.nodi[index].rgt + 1)) 
50:     {
51:       return i;
52:     }
53:   }
54:   return -1;
55: }
56: 
57: int find_first_son(const struct gerarchia tree, const int parent){
58:   int i;
59: 
60:   for(i=0; i<tree.num_nodi; ++i)
61:   {
62:     if( (tree.nodi[i].lft == (tree.nodi[parent].lft + 1) ) && (tree.nodi[i].rgt < tree.nodi[parent].rgt) ) // non solo controllo che i due lft siano come richiesto ma che il nodo in esame sia anche in un sottoalbero
63:       return i;
64:   }
65:   return -1;
66: }
67: void print_nome(const char *s, const int level)
68: {
69:   int i;
70:   for(i=0; i<level; ++i)
71:     printf(" ");
72:   printf("%s\n", s);
73: }
74: 
75: void print_hierarchy(const struct gerarchia tree, const int index, const int level)
76: {
77:   int search; // variabile di appoggio usata nella riocerca figli e/o fratelli 
78: 
79: 
80:   if(index >= tree.num_nodi) // sono arrivato in fondo (in realta' non dovrebbe accadere)
81:     return;
82: 
83:   print_nome(tree.nodi[index].nome, level);
84:   search = find_first_son(tree, index);
85:   if( search >= 0 )
86:   {
87:     print_hierarchy(tree, search, level + 1);
88:   }
89:   
90:   
91:   search=index;
92:   if ( (search = find_next_sibling(tree, search)) != -1)
93:   {
94:     print_hierarchy(tree, search, level);
95:   }
96:   
97: }
98: 
99: