C中具有邻接矩阵的图

时间:2017-10-01 12:18:11

标签: c graph-algorithm adjacency-matrix

我有struct

struct graph {
    int** adj; /**< Adjacency matrix. */
    int n; /**< Number of nodes in graph. */
};

我必须在这个函数中创建一个空图:

struct graph *graph_create(int nodes) {
  //To implement
}

如何使用双指针int** adj创建矩阵?

2 个答案:

答案 0 :(得分:0)

以下是使用malloc()定义矩阵的方法 我从GeeksForGeeks获得了一些版本。

包含int **malloc()

的二维整数矩阵
int r = 3, c = 4, i, j, count;

//arr[r][c]
int **arr = (int **)malloc(r * sizeof(int *));

for (i=0; i<r; i++){
    *(arr +i) = (int *)malloc(c * sizeof(int));
    //arr[i] = (int *)malloc(c * sizeof(int));
}

// Note that arr[i][j] is same as *(*(arr+i)+j)
count = 0;
for (i = 0; i <  r; i++)//3
    for (j = 0; j < c; j++)//4
        arr[i][j] = ++count;  // OR *(*(arr+i)+j) = ++count

for (i = 0; i <  r; i++){
    printf("\n");
    for (j = 0; j < c; j++){
        printf("%d ", arr[i][j]);
    }
}

我们可以将这些代码放在graph_create(int nodes)函数中。

<强>代码

struct graph {
    int** adj; /**< Adjacency matrix. */
    int n; /**< Number of nodes in graph. */
}G;


struct graph *graph_create(int nodes) {

    struct graph * tmp = &G;
    int r = nodes, c = nodes, i, j, count;

    //arr[r][c]
    G.adj = (int **)malloc(r * sizeof(int *));

    for (i=0; i<r; i++){
         *(G.adj + i) = (int *)malloc(c * sizeof(int));
         //arr[i] = (int *)malloc(c * sizeof(int));
    }


    count = 0;
    for (i = 0; i <  r; i++)//3
      for (j = 0; j < c; j++)//4
         G.adj[i][j] = ++count;  // OR *(*(arr+i)+j) = ++count

    for (i = 0; i <  r; i++){
        printf("\n");
        for (j = 0; j < c; j++){
            printf("%d ", G.adj[i][j]);
        }
    }

    return tmp;

}



int main()
{


    struct graph * d = graph_create(5);

    printf("\n");
    return 0;
}

我们知道图的邻接矩阵具有n * n维。 为此,我们将节点用作行和列。

修改

为了安全地使用malloc()函数,我们必须通过使用这些块调用malloc()来释放free()保留的内存位置。 (类似于Mobius回答)

return 0;中的main()语句之前

调用此:

free ((*d).adj);

必需的头文件:

#include <stdio.h>
#include <stdlib.h> // for** malloc()**, **free()**

答案 1 :(得分:0)

为了分配矩阵,您需要为实际矩阵数据(大小为width * height * sizeof(int))分配空间。

在使用int**矩阵的设置中,您还需要分配一个指针数组,指向每行的开头,如果您想避免这种情况,您可以通过执行操作来简单地计算偏移量像size_t offset = row * width + column这样的东西。

要分配指针,我们需要height * sizeof(int*)个字节。

最后,您需要在数组中指定行指针。

所有代码应该像这样:

int ** allocate_matrix(size_t width, size_t height){
    int *  values = malloc(height * width * sizeof(int));
    int ** rows   = malloc(height * sizeof(int*));

    size_t i;
    for (i = 0; i < height; i++) {
        size_t offset = i * width;
        rows[i] = &values[offset];
    }

    return rows;
}

// the returned matrix can me indexed like `matrix[row][column]`

为了释放adj所指向的记忆:

void free_matrix(int ** rows) {
    // this points to the beginning of our region of memory for values;
    int * values = rows[0]; 

    free(values);
    free(rows);
}