#include #include #include #include typedef struct node { char* name; int visited; struct node* parents; } node; node* mem[100];// = (node**)malloc(sizeof(node*) * 10); #define idx(n) (((size_t)(n) - (size_t)mem[0]) / sizeof(node*)) int count_skills(node* dest) { int ret = 1; dest->visited = 1; if (!dest->parents) { /*printf("%s no parents at %d\n", dest->name, idx(dest));*/ return ret; } for (node* n = dest->parents; n; n++) { /*printf("next parent of %s: %s %p %d\n", dest->name, n->name,idx(n));*/ printf("checking %d\n", idx(n)); if (n->visited) { continue; } printf("going into %p %d\n", n, idx(n)); ret += count_skills(n); printf("came back from %s at %d, will go to %d next\n", n->name, idx(n), idx(n+1)); } return ret; } int main(void) { node nodes[100]; memset(&nodes, 0, sizeof(node)*100); node* nn = NULL; mem[0] = &nodes[0]; mem[1] = NULL; mem[2] = &nodes[1]; mem[3] = NULL; mem[4] = NULL; mem[5] = &nodes[2]; mem[1] = NULL; mem[9] = &nn; mem[8] = NULL; /*mem[5] = NULL;*/ mem[6] = &nn; mem[10] = NULL; mem[15] = NULL; mem[18] = NULL; /*&nodes[3] = NULL;*/ mem[0]->name = "fireball"; mem[0]->visited = 0; mem[0]->parents = mem[2]; mem[2]->name = "fire"; mem[2]->visited = 0; mem[2]->parents = mem[5]; mem[4] = &nn; mem[5]->name = "magic"; mem[5]->visited = 0; mem[5]->parents = NULL; //(mem +5) = (node*)NULL; /*mem[2].parents->name = "magic";*/ printf("%d\n", count_skills(mem[0])); }