]> wirehaze git hosting - graph-theory.git/blob - graph/adj.c

wirehaze git hosting

e44f58344175baab1ddc32e21e19466aadde1283
[graph-theory.git] / graph / adj.c
1 #include "graph/adj.h"
2 #include <errno.h>
3 #include <stdlib.h>
4
5 struct graph *
6 new_graph (unsigned int nv)
7 {
8 struct graph *g;
9
10 if (!nv)
11 {
12 errno = EINVAL;
13 return NULL;
14 }
15
16 if (!(g = malloc (sizeof *g)))
17 return NULL;
18
19 g->nv = nv;
20
21 if (!(g->v = calloc (nv, sizeof *g->v)))
22 {
23 free (g);
24 return NULL;
25 }
26
27 return g;
28 }
29
30 int
31 new_arc (struct graph *g, unsigned int vi, unsigned int vj)
32 {
33 struct edge *e;
34
35 if (vi >= g->nv || vj >= g->nv)
36 return -(errno = EINVAL);
37
38 if (!(e = malloc (sizeof *e)))
39 return -errno;
40
41 e->to = &g->v[vj];
42 e->next = g->v[vi].adj;
43 g->v[vi].adj = e;
44
45 return 0;
46 }
47
48 int
49 new_edge (struct graph *g, unsigned int vi, unsigned int vj)
50 {
51 int err;
52
53 if (vi == vj)
54 return -(errno = EINVAL);
55
56 if ((err = new_arc (g, vi, vj)))
57 return err;
58
59 if ((err = new_arc (g, vj, vi)))
60 return err;
61
62 return 0;
63 }