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: