【问题标题】:Adjacency List for Graphs in CC中图的邻接表
【发布时间】:2016-07-28 14:01:29
【问题描述】:

我在使用邻接列表时打印顶点时遇到问题。我只想得到起始顶点,没有邻居,但我得到了他们的地址。所以,我遇到了指针问题。现在我不明白为什么它没有打印正确的输出。我的代码是:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct ADI{
    int val;
    struct ADI *urm;
}ADI;

ADI *adjancencyList( int vertex )
{
  int neigh,i;
  ADI *head, *elem, *vec;
  head = ( ADI* ) malloc( sizeof( ADI ) );
  head->val = vertex;
  elem = head;
  printf( "Input number of neighbours:" );
  scanf( "%d", &neigh );
  for( i = 0; i < neigh ; i++)
    {   printf( "Neighbour:" );
        vec = ( ADI* ) malloc( sizeof( ADI ) );
        elem->urm = vec;
        scanf( "%d", &elem->val );
    }

  return head;
}
int main()
{   int i, n, v;
    printf("Input number of vertices ");
    scanf( "%d", &n );
    ADI *A = ( ADI* ) malloc( n * sizeof( ADI ) );

    for( i = 0; i < n; i++ )
    {
        printf( "Input vertex name:" );
        scanf( " %d ", &v );
        A = adjancencyList( v );
        A++;
    }

    A = &( A[0] );

    for( i = 0; i < n; i++ )
    {
     printf(" %d ", A->val  );
     printf( " \n " );
     A++;
    }
     return 0;

}

【问题讨论】:

  • 请提供输入示例、预期输出和实际输出。
  • @MichaelWalz:“伟大的思想......”
  • 请注意,如果输入来自用户而不是文件,scanf()-family 格式字符串中的尾随空格是恶魔般的。基本问题是 scanf() 函数在实际输入后遇到非空白字符时才会返回。
  • 在您的adjacencyList() 函数中,您没有正确初始化每个分配的相邻节点,并且您没有正确地将它们链接到列表中。实际上,除了分配的最后一个节点外,您正在泄漏所有内容。这会导致严重的“未定义行为”,使用未定义行为后一切皆有可能。

标签: c pointers


【解决方案1】:

您的程序导致内存泄漏。您应该使用ADI* 的数组,而不是ADI 的数组来存储从adjancencyList() 返回的内容。在这种情况下,使用下标看起来比递增更好。另一个提示是 A = &amp;( A[0] ); 几乎什么都不做。

还要注意他们说的是you shouldn't cast the result of malloc() in C

试试这个:

int main(void)
{
    int i, n, v;
    printf("Input number of vertices ");
    scanf( "%d", &n );
    ADI **A = malloc( n * sizeof( ADI* ) );

    for( i = 0; i < n; i++ )
    {
        printf( "Input vertex name:" );
        scanf( " %d ", &v );
        A[i] = adjancencyList( v );
    }

    for( i = 0; i < n; i++ )
    {
        printf(" %d ", A[i]->val  );
        printf( " \n " );
    }
     return 0;

}

【讨论】:

  • 感谢您的回答!根据我的阅读,我预计需要使用双指针。你能解释一下为什么这是正确的形式吗?我不是指向我的向量的第一个地址吗?另外,我使用了 A= &(A[0]),所以在 for 结束之后,我又回到了第一个地址。
  • @AlexPostolache main()A 的这种用法是正确的(@JonathanLeffler 指出您的adjancencyList() 也是错误的)因为A 的类型适合元素类型( ADI*)。你的A 指向通过malloc() 分配的内容,但它被分配A = adjancencyList( v ); 覆盖。 A= &amp;(A[0])相当于A= &amp;(*(A+0),相当于A=&amp;*A,相当于A=A,不费力。
猜你喜欢
  • 1970-01-01
  • 2013-07-29
  • 1970-01-01
  • 2019-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多