使用邻接矩阵创建图

时间:2018-06-22 17:34:10

标签: c function matrix graph malloc

这是我的书房

struct node{
    int V,E;
    int **adj;
};

这是我创建图形的代码:

struct node* create()
{
    int i,j,x,y;
    struct node *G=malloc(sizeof(struct node));
    printf("Write the number of vertex and edges\n");
    scanf("%d%d",&G->V,&G->E);
    G->adj=malloc(sizeof(int)*(G->V * G->V));
    if(!G->adj){
        printf("Out of memory\n");
        return;
    }
    for(i=0;i<G->V;i++)
    for(j=0;j<G->V;j++)
    G->adj[i][j]=0;
    printf("\nWrite the source node and destination: ");
    for(i=0;i<G->E;i++){
    scanf("%d%d",&x,&y);
    G->adj[x][y]=1;
    G->adj[y][x]=1;
    }
    return(G);
}

并且我将此函数返回的指针存储在另一个这样的指针中:

int main()
{
    struct node *G=create();
}

编译程序时,系统会询问我顶点和边的数量,但是一旦输入值,程序就会崩溃。我想知道原因。这是因为内存分配失败吗?

1 个答案:

答案 0 :(得分:0)

C99样式的可变长度数组仅对局部变量或参数有用。因此,您可以使用两种经典的C方法来实现2D数组。

  1. 指针数组:

这就是您的结构的样子。这样,您就需要为指针数组和数据分配单独的空间:

G->adj = calloc(G->V, sizeof (int*));
assert(G->adj != NULL); /* need assert.h for this */
for (i=0; i<G-V; ++i)
{
    G->adj[i] = calloc(G->V, sizeof (int));
    assert(G->adj[i] != NULL);
}

先对数组数据进行一次大容量分配,然后使用指针算法设置G->adj[]指针,这在内存上要容易一些,但是上面的想法是,就C而言,每一行是一个单独的数组。

  1. 只有一个散装数组,每次访问都进行了显式的单元位置计算。这就是C在内部使用嵌套数组的方式。

adj的类型更改为仅int*,然后:

G->adj = calloc(G->V * G->V, sizeof (int));
assert(G->adj != NULL);

就是这样。现在,当您访问元素时,请使用G->adj[i*G->V + j]而不是G->adj[i][j]。宏可能有助于提高可读性。