我有struct
:
struct graph {
int** adj; /**< Adjacency matrix. */
int n; /**< Number of nodes in graph. */
};
我必须在这个函数中创建一个空图:
struct graph *graph_create(int nodes) {
//To implement
}
如何使用双指针int** adj
创建矩阵?
答案 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);
}