无法从我的adjaceny矩阵代码中获取结果来声明图形

时间:2016-12-27 15:51:30

标签: c data-structures graph

我已经为图形声明的邻接矩阵编写了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;
}

4 个答案:

答案 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;

}