在 C 中创建具有邻接矩阵的图形



我正在实现一个基于C语言邻接矩阵的图程序。 但是我在初始化矩阵(分配零值(时遇到了分割错误。 我不确定我在访问双指针时是否犯了任何错误。

任何人都可以帮助我解决问题吗?

这是代码:

struct Graph {
int V;
int E;
int **adj;
};

struct Graph *addelements() {
int i,j,a,u,v;  
struct Graph *G= (struct Graph*)malloc(sizeof(struct Graph*));
printf("Enter the number of vertices and edges : ");
scanf("%d %d", &G->V,&G->E);;
printf("%d, %dn",G->V ,G->E);
//G->adj = (int **)malloc(sizeof(int **)*(G->V * G->E));
G->adj = malloc(sizeof(G->V * G->E));
//Initialization of vertices
for(i=0;i<=G->V;i++) {
for(j=0;i<=G->V;j++) {
G->adj[i][j]=0;
}
}

//Reading the edges;
for(i=0;i<G->E;i++) {
printf("Enter the source and destination : ");  
scanf("%d %dn", &u,&v);       
G->adj[u][v]=1;    
G->adj[v][u]=1;
}
//printing the matrix
for(i=0;i< G->V;i++) {
for(j=0;i< G->V;j++) {
printf("%d", G->adj[i][j]);4
}
}
return G;
}

int main() {  
struct Graph *a= (struct Graph*)malloc(sizeof(struct Graph*)); 
a =  addelements();  
} 

输出:

输入顶点和边的数量:4 5

分段故障(核心转储(

正如你提到的,你的错误就在那里

G->adj = malloc(sizeof(G->V * G->E));
//Initialization of vertices
for(i=0;i<=G->V;i++)
{
for(j=0;j<=G->V;j++) 
{
G->adj[i][j]=0;
}
}
  • 您正在adj[V][V]处写入,您分配了sizeof(G->V * G->E)的大小,这将是sizeof(int)(一个整数(,即使您想要最多adj[V][E]

  • 此外,您正在分配一维数组并访问一维数组,访问adj[0][0]将首先尝试读取adj[0]作为指向数组的指针(未定义的值(,并尝试写入undefined[0]

使用malloc( G->V * G->V * sizeof(int) )进行分配,使用adj[i*V+j]进行访问/写入

由于您期望代码的行为与它真正理解您的方式,您的逻辑中存在很多错误。使用调试器了解错误发生的位置并检查所涉及的变量可能很有用。

编辑:

正如其他答案提到的:

您正在为G分配一个 small 的大小,因为malloc(sizeof(struct Graph*))等同于malloc(sizeof(void*))(分配一个指针的大小(,您在其中malloc(sizeof(struct Graph))

第二次编辑:

注意到j循环中的拼写错误for(j=0;i<=G->V;j++)应该for(j=0;j<=G->V;j++)

我认为您需要修改

struct Graph *G= (struct Graph*)malloc(sizeof(struct Graph*));

struct Graph *G= malloc(sizeof(struct Graph));

因为您需要分配空间来存储结构变量而不是指针。

而且您没有为G->adj正确分配空间。

尝试

G->adj = malloc(sizeof(int **));
for(int i=0; i<G->V; ++i)
{
G->adj[i]=malloc(sizeof(int)*G->V);
}

并将您的循环修改为

for(i=0;i<G->V;i++)
{
for(j=0;j<G->V;j++) 
{
G->adj[i][j]=0;
}
}

即,将<=更改为<以防止超出数组范围访问。

在阅读边缘时,不要这样做

scanf("%d %dn", &u,&v);       

最后是换行符。看到这里。

此外,您需要检查输入的uv值是否在限制范围内,如

for(i=0;i<G->E;i++)  
{
printf("Enter the source and destination : ");  
scanf("%d %d", &u,&v);       
if(u<G->V && v<G->V)
{
G->adj[u][v]=1;    
G->adj[v][u]=1;
}
else
{
printf("ninvalid value. Try again.");
i--;
}
}

而且,您无需在main()中为该struct指针分配空间,因为您已经为将在addelements()函数中存储在该指针中的值分配了内存。否则会导致内存泄漏。

所以,在main()中,做

struct Graph *a= addelements();

请注意,如果malloc()分配内存失败,则返回NULL。您还需要检查malloc()调用是否失败。

而且你不需要在 C 中强制转换malloc()的返回值。

您正在为指针malloc空间。请改用:

malloc(sizeof(struct Graph));

相关内容

  • 没有找到相关文章

最新更新