邻接矩阵在c语言中的实现

邻接矩阵在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

我试图用邻接矩阵实现一个图,但我对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*)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);