繁体   English   中英

无法从我的邻接矩阵代码中获取结果以声明图

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM