[英]Not able to get result out of my adjaceny matrix code for declaring graph
我已经为图声明的邻接矩阵编写了代码。 它编译成功,没有错误。 但是,当我运行代码并输入值时,我的代码只有在读取了边和顶点的数量即v&e的值后才会崩溃。 我无法输入边缘值, 即U&诉 需要帮忙。
#include<stdio.h>
struct Graph
{
int v;
int e;
int **Adj;
};
struct Graph *adjMatrixOfGraph()
{
int i,u,v;
struct Graph *G = (struct Graph *)malloc(sizeof(struct Graph));
if(!G)
{
printf("Memory Error");
return 0;
}
scanf("Number of Vertices:%d Number of Edges:%d",&G->v,&G->e);
G->Adj = (int** )malloc(sizeof(G->v*G->v));
G->Adj =(int **) malloc(G->v*sizeof(int*));
for ( i = 0; i < G->v; ++i)
{
*(G->Adj+i) = (int*) malloc(G->v*sizeof(int));
}
for(u=0;u<G->v;u++)
{
for(v=0;v<G->v;v++)
{
G->Adj[v][v]=0;
}
}
for(i=0;i<G->v;i++)
{
scanf("Reading Edge:%d %d",&u,&v);
G->Adj[u][v]=1;
G->Adj[v][u]=1;
}
return G;
}
int main()
{
int a;
struct Graph *p = adjMatrixOfGraph();
int u,v;
p->Adj = malloc(sizeof(p->v*p->v));
for(u=0;u<p->v;u++)
{
for(v=0;v<p->v;v++)
{
if(p->Adj[u][v]==1)
printf("\n there is an edge from%d",u,"---------->%d",v);
}
}*/
return 0;
}
使用简单的scanf ..不要在scanf中获得“给定的边缘..”等。 只需使用scanf("%d %d",&u,&v);
for(i=0;i<G->v;i++)
{
//scanf("Reading Edge:%d %d",&u,&v);
if(scanf("%d %d",&u,&v)==2){//works
..
}
...
}
否则,scanf期望您完全从标准输入中键入那些字母。
for(i=0;i<G->e;i++)
{
if(scanf("Reading Edge:%d %d",&u,&v)!=2){ //debug; }
G->Adj[u][v]=1;
G->Adj[v][u]=1;
}
取边而不是输入的顶点数。
作为4386427 ..在scanf
..中添加一个检查,这也是一种很好的做法,也很有效。
不确定这是导致崩溃的原因,但是代码中包含许多奇怪的东西。
1)始终检查scanf返回值
if (scanf("Number of Vertices:%d Number of Edges:%d",&G->v,&G->e) != 2)
{
// Add error handling
}
2)内存泄漏
G->Adj = (int** )malloc(sizeof(G->v*G->v));
G->Adj =(int **) malloc(G->v*sizeof(int*));
在这里,您两次分配给G->Adj
,从而导致内存泄漏。 此外,第一次分配看起来不正确,因为它不使用sizeof
。
3)不使用扫描值,即从不使用G->e
。
4)奇怪的索引
for(u=0;u<G->v;u++)
{
for(v=0;v<G->v;v++)
{
G->Adj[v][v]=0;
}
}
在这里,您永远不会将u
用于索引。 应该是: G->Adj[u][v]=0;
5)主存中的另一个内存泄漏
p->Adj = malloc(sizeof(p->v*p->v));
再次,您覆盖Adj
并导致内存泄漏。 sizeof(p->v*p->v)
看起来很奇怪。 它应该是sizeof(int*)*p->v*p->v
吗? 此外,该函数中完成的所有初始化都将丢失。 这意味着当您开始以int
访问数据时,您将具有未定义的行为。 也许,您根本不应该在main
执行malloc
。
这次我们似乎需要3个答案。 ;)虽然4386427解决了内存泄漏和错误的分配样式,但Coderredoc解决了scanf和loop变量的错误用法。
另外,printf的调用不正确:
printf("\n there is an edge from%d",u,"---------->%d",v);
这些是1个格式说明符的3个参数。 它应该更改为
printf("\n there is an edge from %d---------->%d",u,v);
如果您照顾到所有三个答案,您的代码应该可以正常工作。
Finally, from going through all the suggestion made above, ihave updated my code to as below.But the problem persist.
#include<stdio.h>
#include<stdlib.h>
//using namespace std;
struct Graph
{
int v;
int e;
int **Adj;
};
struct Graph *adjMatrixOfGraph()
{
int i,u,v;
struct Graph *G = (struct Graph *)malloc(sizeof(struct Graph));
if(!G)
{
printf("Memory Error");
return 0;
}
scanf("%d %d",&G->v,&G->e);
G->Adj= malloc(G->v * sizeof(int *));
for(i = 0; i < G->v; i++) {
G->Adj[i] = malloc(G->v * sizeof(int));
}
for(u=0;u<G->v;u++)
{
for(v=0;v<G->v;v++)
{
G->Adj[v][v]=0;
}
}
for(i=0;i<G->v;i++)
{
scanf("%d %d",&u,&v);
G->Adj[u][v]=1;
G->Adj[v][u]=1;
}
return G;
}
int main()
{
int a;
int i;
struct Graph *p = adjMatrixOfGraph();
// printf("Number of Vertices:%d, Number of Edges:%d",p->v,p->e);
int u,v;
p->Adj= malloc(p->v * sizeof(int *));
for(i = 0; i < p->v; i++) {
p->Adj[i] = malloc(p->v * sizeof(int));
}
for(u=0;u<p->v;u++)
{
for(v=0;v<p->v;v++)
{
if(p->Adj[u][v]==1)
printf("\n there is an edge from%d",u,"---------->%d",v);
}
}
return 0;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.