邻接矩阵在c语言中的实现
我试图用邻接矩阵实现一个图,但我对2d数组的内存分配感到困惑 是否正确邻接矩阵在c语言中的实现,c,data-structures,graph,C,Data Structures,Graph,我试图用邻接矩阵实现一个图,但我对2d数组的内存分配感到困惑 是否正确G->adj=(int**)malloc(sizeof(G->v*G->v)) 或者下面的一个是正确的 #include<stdio.h> #include<stdlib.h> struct Graph{ int V; int E; int **adj; }; struct Graph* adjmatrix(){ int u,v,i; struct Graph* G=(struct Graph
G->adj=(int**)malloc(sizeof(G->v*G->v))
或者下面的一个是正确的
#include<stdio.h>
#include<stdlib.h>
struct Graph{
int V;
int E;
int **adj;
};
struct Graph* adjmatrix(){
int u,v,i;
struct Graph* G=(struct Graph*)malloc(sizeof(struct Graph));
if(!G)
printf("Memory Null");
printf("enter the number of vertex and edges");
scanf("%d %d",&G->V,&G->E);
G->adj=(int**)malloc(sizeof(int*)*( G->V * G->V ));
for(u=0;u<G->V;u++){
for(v=0;v<G->V;v++){
G->adj[u][v]=0;
}
}
for(i=0;i<G->V;i++){
printf("reading edge");
scanf("%d %d",&u,&v);
G->adj[u][v]=1;
G->adj[v][u]=1;
}
return G;
}
#包括
#包括
结构图{
INTV;
INTE;
int**adj;
};
结构图*adjmatrix(){
int u,v,i;
结构图*G=(结构图*)malloc(sizeof(结构图));
if(!G)
printf(“内存空”);
printf(“输入顶点和边的数量”);
扫描频率(“%d%d”,&G->V,&G->E);
G->adj=(int**)malloc(sizeof(int*)*(G->V*G->V));
对于(u=0;uV;u++){
对于(v=0;vV;v++){
G->adj[u][v]=0;
}
}
对于(i=0;iV;i++){
printf(“阅读边缘”);
scanf(“%d%d”、&u和&v);
G->adj[u][v]=1;
G->adj[v][u]=1;
}
返回G;
}
如果要使用指向指针的指针存储矩阵,则需要在第一步为行分配内存,然后为列分配内存:
// create G->V rows
G->adj=(int**)malloc( sizeof(int*) * G->V);
// for every row create G->V columns
for (int i = 0; i < G->V; ++i)
G->adj[i] = (int*)malloc (sizeof(int) * G->V);
分配内存
G->adj=(int*)malloc(sizeof(int) * ( G->V * G->V));
和访问元素
G->adj[ u*G->V + v ] = value;
有几种方法可以为C中的2D数组分配内存。专门针对您的代码进行定制,您可以执行以下任一操作: 分别为每行分配内存: 首先为指针数组分配内存,每行一个,然后使用这些指针为整数数组分配内存
// Pointer array of rows
G->adj = (int **)malloc(G->V * sizeof(int *));
// Allocate memory for each row
for (int i = 0; i < G->V; i++)
G->adj[i] = (int *)malloc(G->V * sizeof(int));
//行的指针数组
G->adj=(int**)malloc(G->V*sizeof(int*);
//为每行分配内存
对于(inti=0;iV;i++)
G->adj[i]=(int*)malloc(G->V*sizeof(int));
立即分配内存并重新定向:
首先为指针数组分配内存,每行分配一个,并分配足够的内存以使用第一个指针存储完整的矩阵。然后重新定向数组中的每个指针,以指向该分配空间的每一行
// Pointer array of rows
G->adj = (int **)malloc(G->V * sizeof(int *));
// Allocate enough space for a matrix
G->adj[0] = (int *)malloc(G->V * G->V *sizeof(int));
// Use each pointer to point to a block G->V distance
// from the previous pointer
for(i = 0; i < G->V; i++)
G->adj[i] = (*G->adj + G->V * i);
//行的指针数组
G->adj=(int**)malloc(G->V*sizeof(int*);
//为矩阵分配足够的空间
G->adj[0]=(int*)malloc(G->V*G->V*sizeof(int));
//使用每个指针指向块G->V距离
//从上一个指针
对于(i=0;iV;i++)
G->adj[i]=(*G->adj+G->V*i);
您只分配了一个内存块,而不是2D数组。你甚至不需要二维数组,因为它不是锯齿状的,你可以用一维数组来代替,这样会更简单。先生,请告诉我代码malloc(sizeof(G->v*G->v))
肯定是错误的。与malloc(sizeof(int))相同你能把答案写在下面以便我能正确理解吗
// Pointer array of rows
G->adj = (int **)malloc(G->V * sizeof(int *));
// Allocate enough space for a matrix
G->adj[0] = (int *)malloc(G->V * G->V *sizeof(int));
// Use each pointer to point to a block G->V distance
// from the previous pointer
for(i = 0; i < G->V; i++)
G->adj[i] = (*G->adj + G->V * i);