forked from cjlee112/pygr
/
cgraph.c
119 lines (94 loc) · 1.92 KB
/
cgraph.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#include "cgraph.h"
CDict *cdict_alloc(int n)
{
CDict *d=0;
d=calloc(1,sizeof(CDict));
if (d==0) /* calloc FAILED!! */
return 0;
d->dict=calloc(n,sizeof(CDictEntry));
if (d->dict==0) { /* calloc FAILED!! */
free(d); /* DUMP OUR EMPTY STRUCTURE */
return 0;
}
return d; /* RETURN OUR DATA STRUCTURE */
}
int cdict_free(CDict *d)
{
free(d->dict);
free(d);
return 0;
}
int cdict_qsort_cmp(const void *void_a,const void *void_b)
{ /* STRAIGHTFORWARD COMPARISON OF SIGNED start VALUES, LONGER INTERVALS 1ST */
CDictEntry *a=(CDictEntry *)void_a,*b=(CDictEntry *)void_b;
if (a->k<b->k)
return -1;
else if (a->k>b->k)
return 1;
else
return 0;
}
CDictEntry *cdict_getitem(CDict *d,int k)
{
int l=0,mid,r;
CDictEntry *p;
if (d==0) /* HANDLE NULL POINTER PROPERLY */
return 0;
p=d->dict; /* SORTED ARRAY OF ENTRIES */
r=d->n;
while (l<r) {
mid=(l+r)/2;
if (p[mid].k==k)
return p+mid;
else if (p[mid].k<k)
l=mid+1;
else
r=mid;
}
return 0;
}
CGraph *cgraph_alloc(int n)
{
CGraph *d=0;
d=calloc(1,sizeof(CGraph));
if (d==0) /* calloc FAILED!! */
return 0;
d->dict=calloc(n,sizeof(CGraphEntry));
if (d->dict==0) { /* calloc FAILED!! */
free(d); /* DUMP OUR EMPTY STRUCTURE */
return 0;
}
return d; /* RETURN OUR DATA STRUCTURE */
}
int cgraph_free(CGraph *d)
{
int i;
for (i=0;i<d->n;i++) /* DUMP ALL ASSOCIATED DICTIONARIES */
cdict_free(d->dict[i].v);
free(d->dict);
free(d);
return 0;
}
CGraphEntry *cgraph_getitem(CGraph *d,int k)
{
int l=0,mid,r;
CGraphEntry *p;
if (d==0) /* HANDLE NULL POINTER PROPERLY */
return 0;
p=d->dict; /* SORTED ARRAY OF ENTRIES */
r=d->n;
while (l<r) {
mid=(l+r)/2;
if (p[mid].k==k)
return p+mid;
else if (p[mid].k<k)
l=mid+1;
else
r=mid;
}
return 0;
}
int *calloc_int(int n)
{
return (int *)calloc(n,sizeof(int));
}