我正在尝试用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]。 你能解释一下这是如何运作的吗?
我希望问题很明确,因为我自己很困惑。
答案 0 :(得分:1)
struct successors {
/*
*/
int list[1]; /* actual list of successors */
} *alist[1];
在*
成员上使用双间接(每个指针op &
/ []
并且下标运算符alist
是间接级别并需要额外的内存访问)使每个索引都为malloc
'd。
struct successors {
/*
*/
int *list; /* actual list of successors */
} *alist;
没有。
另外,从你的链接:
/* basic directed graph type */
typedef struct graph *Graph;
该链接有很多代码。
我不完全理解如何使用->list
,但您的方法仅为int *
保留空间,而原始版本同时保留指针和目标int
。
分配
g = malloc(sizeof(struct graph) + sizeof(struct successors *) * (n-1));
仅分配successors *
,因此每个successors
对象可以(理论上)粗略地扩展为指向更多int
。