90 lines
1.5 KiB
C
90 lines
1.5 KiB
C
|
#include "matcom.h"
|
||
|
#include <stdlib.h>
|
||
|
#include <assert.h>
|
||
|
#include <string.h>
|
||
|
#include <stdio.h>
|
||
|
|
||
|
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);
|
||
|
}
|
||
|
}
|
||
|
}
|