我正在尝试在 C 中创建一个数据结构来表示图形。我发现这个非常有用的链接:
http://pine.cs.yale.edu/pinewiki/C/Graphs
在我看来,这是一个很好的起点。但是我在理解数据结构时遇到了一些问题。
struct graph {
int n; /* number of vertices */
int m; /* number of edges */
struct successors {
int d; /* number of successors */
int len; /* number of slots in array */
char is_sorted; /* true if list is already sorted */
int list[1]; /* actual list of successors */
} *alist[1];
};
我不明白为什么结构后继者按原样声明而不是以这种方式声明:
struct graph {
int n; /* number of vertices */
int m; /* number of edges */
struct successors {
int d; /* number of successors */
int len; /* number of slots in array */
char is_sorted; /* true if list is already sorted */
int *list; /* actual list of successors */
} *alist;
};
正如我在创建图表的后续函数中看到的那样:
Graph
graph_create(int n)
{
Graph g;
int i;
g = malloc(sizeof(struct graph) + sizeof(struct successors *) * (n-1));
assert(g);
g->n = n;
g->m = 0;
for(i = 0; i < n; i++) {
g->alist[i] = malloc(sizeof(struct successors));
assert(g->alist[i]);
g->alist[i]->d = 0;
g->alist[i]->len = 1;
g->alist[i]->is_sorted= 1;
}
return g;
}
它为 alist 分配了更多空间,我不明白为什么将其声明为 alist[1]。你能解释一下这是如何工作的吗?
我希望这个问题很清楚,因为我自己也很困惑。