我已经为图形声明的邻接矩阵编写了acode。它成功编译,没有错误。但是当我运行代码并输入值时,我的代码只有在读取了边数和顶点的数值,即v&即 我无法输入 edge的值,即u& v 。需要帮助。
#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;
}
答案 0 :(得分:2)
使用简单的scanf ..在scanf中获取“Give edges ..”等。只需使用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 :(得分:1)
不确定这是导致崩溃的原因,但您的代码中有许多奇怪的内容。
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
访问数据时,您有未定义的行为。也许,你根本不应该malloc
中的main
。
答案 2 :(得分:1)
这次我们似乎需要3个答案。 ;) 虽然4386427解决了内存泄漏和不正确的分配方式,但Coderredoc解决了scanf和循环变量的错误用法。
此外,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);
如果您处理所有3个答案,您的代码应该有效。
答案 3 :(得分:0)
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;
}