98 lines
1.8 KiB
C
98 lines
1.8 KiB
C
#include "vec.h"
|
|
#include <assert.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
nodept new_node(int num)
|
|
{
|
|
struct node *n = malloc(sizeof(nodept));
|
|
assert(n);
|
|
// n->succ = malloc((n->cap = 8) * sizeof(nodept));
|
|
// assert(n->succ);
|
|
n->num = num;
|
|
n->nbs = 0;
|
|
return n;
|
|
}
|
|
|
|
void delete_node(struct node *n)
|
|
{
|
|
int i;
|
|
// for (i = 0; i < n->nbs; i++) {
|
|
// free(n->succ[i]);
|
|
// }
|
|
// free(n->succ);
|
|
}
|
|
|
|
void insert_succ(graph_vec *g, int i, int i1, fix_str str)
|
|
{
|
|
if (g->node[i]->nbs == g->node[i]->cap)
|
|
g->node[i]->succ = reallocarray(g->node[i]->succ, (g->node[i]->cap += 5), sizeof(nodept));
|
|
struct node *n = malloc(sizeof(struct node));
|
|
n->num = i;
|
|
n->nbs = 0;
|
|
strcpy(n->func, str);
|
|
g->node[i]->succ[i1] = n;
|
|
g->node[i]->nbs++;
|
|
}
|
|
|
|
graph_vec new_graph(int cap)
|
|
{
|
|
graph_vec g;
|
|
g.n = -1;
|
|
g.cap = cap;
|
|
// g.func = calloc(cap, sizeof(fix_str));
|
|
// g.node = calloc(cap, sizeof(nodept));
|
|
return g;
|
|
}
|
|
|
|
void insert_node(graph_vec *g, int i, fix_str str, bool intern)
|
|
{
|
|
++g->n;
|
|
struct node *n = malloc(sizeof(struct node));
|
|
n->num = i;
|
|
n->nbs = 0;
|
|
n->cap = 5;
|
|
n->succ = malloc(5 * sizeof(nodept));
|
|
strcpy(n->func, str);
|
|
g->node[g->n] = n;
|
|
}
|
|
|
|
void delete_graph(graph_vec *g)
|
|
{
|
|
int i, j;
|
|
for (i = 0; i <= g->n; ++i) {
|
|
if (g->node[i]) {
|
|
if (g->node[i]->succ) {
|
|
free(g->node[i]->succ);
|
|
g->node[i]->succ = NULL;
|
|
}
|
|
free(g->node[i]);
|
|
g->node[i] = NULL;
|
|
}
|
|
}
|
|
}
|
|
|
|
int is_in(graph_vec g, fix_str func)
|
|
{
|
|
int i;
|
|
for (i = 0; i < g.n; ++i) {
|
|
if (strcmp(g.node[i]->func, func) == 0)
|
|
return i;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
void print_node(nodept node)
|
|
{
|
|
int i;
|
|
printf("NODE: %s\n", node->func);
|
|
for (int i = 0; i < node->nbs; ++i) {
|
|
printf("SUCC: %s\n", node->succ[i]->func);
|
|
}
|
|
for (int i = 0; i < node->nbs; ++i) {
|
|
if (node->succ[i]->intern)
|
|
print_node(node->succ[i]);
|
|
}
|
|
}
|