图的C结构,有助于理解结构

时间:2012-06-11 15:47:27

标签: c graph

我正在尝试用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]。 你能解释一下这是如何运作的吗?

我希望问题很明确,因为我自己很困惑。

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