#include "matcom.h" #include #include #include #include graph_mco mcgragh(void) { graph_mco g; g.nbs = -1; g.nba = -1; g.func = malloc((g.fcap = 10) * sizeof(fix_str)); assert(g.func); g.vec = malloc((g.vcap = 10) * sizeof(struct edge)); assert(g.vec); return g; } void mcinsert_func(graph_mco *g, fix_str i) { ++g->nbs; if (g->nbs == g->fcap) { g->func = reallocarray(g->func, (g->fcap += 128), sizeof(fix_str)); assert(g->func); } strcpy(g->func[g->nbs], i); } void mcinsert_edge(graph_mco *g, int dep, int arr) { struct edge e; ++g->nba; if (g->nba == g->vcap) { g->vec = reallocarray(g->vec, (g->vcap += 128), sizeof(struct edge)); assert(g->vec); } e.i = dep; if (arr == -1) e.j = g->nbs; else e.j = arr; g->vec[g->nba] = e; } void mcdelete_graph(graph_mco *g) { if (g->func) free(g->func); if (g->vec) free(g->vec); g->func = NULL; g->vec = NULL; } int mcis_in(graph_mco g, fix_str func) { int i; if (g.nba == 0) return -1; for (i = 0; i <= g.nba; i++) { if (strcmp(g.func[i], func) == 0) { return i; } } return -1; } static void mcprint_succ(graph_mco g, int succ) { printf(" Succ: %s\n", g.func[succ]); } void mcprint_edges(graph_mco g, int n) { int i; printf("NODE %d: %s\n", n, g.func[n]); for (i = 0; i <= g.nba; ++i) { if (g.vec[i].i == n) { mcprint_succ(g, g.vec[i].j); } } for (i = 0; i <= g.nba; ++i) { if (g.vec[i].i == n) { if (g.vec[g.vec[i].j].i != -1) mcprint_edges(g, g.vec[g.vec[i].j].i); } } }