【问题标题】:adjacency matrix implementation in cc中的邻接矩阵实现
【发布时间】:2018-09-23 05:21:26
【问题描述】:

我正在尝试使用邻接矩阵来实现图形,我对二维数组的内存分配感到困惑 对吗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;
}

【问题讨论】:

  • 您只分配了一个内存块,而不是二维数组。您甚至不需要 2D 数组,因为它不是锯齿状的,您可以使用 1D 数组来代替它并使其更容易。
  • 请先生告诉我代码
  • malloc(sizeof(G-&gt;v*G-&gt;V)) 肯定是错误的。同malloc(sizeof(int))
  • 你能把答案写在下面,以便我能正确理解

标签: c data-structures graph


【解决方案1】:

如果您想使用指向指针int** adj 的指针来存储矩阵,您需要在第一步为行分配内存,然后为列分配内存:

  // 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);

另一种存储邻接矩阵的方法是创建一维数组,但您需要使用u * G-&gt;V + v 公式来访问(u,v) 项目:

Graph声明:

 int *adj;

分配内存

 G->adj=(int*)malloc(sizeof(int) * ( G->V * G->V));

和访问元素

G->adj[ u*G->V + v ] = value;

【讨论】:

    【解决方案2】:

    在 C 语言中有多种方法可以为二维数组分配内存。根据您的代码量身定制,您可以执行以下任一操作:

    分别为每一行分配内存:

    首先为指针数组分配内存,每行一个,然后使用每个指针为整数数组分配内存。

    // 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));
    

    立即分配内存并重新定向:

    首先为指针数组分配内存,每行一个,然后分配足够的内存来使用第一个指针存储完整的矩阵。然后,您重新定向数组中的每个指针以指向该分配空间的每一行。

    // 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); 
    

    【讨论】:

      猜你喜欢
      • 2014-05-04
      • 2012-12-09
      • 2017-07-24
      • 1970-01-01
      • 2017-10-13
      • 1970-01-01
      • 1970-01-01
      • 2020-09-22
      • 1970-01-01
      相关资源
      最近更新 更多