Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中图的邻接表_C_Pointers - Fatal编程技术网

C语言中图的邻接表

C语言中图的邻接表,c,pointers,C,Pointers,使用邻接列表时打印顶点时遇到问题。我只想得到起始顶点,不想得到相邻顶点,但我得到的是它们的地址。所以,我对指针有一个问题。现在我不明白为什么它不能打印正确的输出。我的代码是: #include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct ADI{ int val; struct ADI *urm; }ADI; ADI *adjancencyList( int ve

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

#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;

}

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

还请注意,他们说

试试这个:

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;

}

请提供一个输入、预期输出和实际输出的示例。@MichaelWalz:好主意……请注意,如果输入来自用户而不是文件,则scanf系列格式字符串中的尾随空格是可怕的。基本问题是,scanf函数不会返回,直到它在实际输入后遇到非空格字符的内容。注意:他们说。在adjacencyList函数中,您没有正确初始化每个分配的相邻节点,也没有正确地将它们链接到列表中。事实上,除了最后分配的节点外,您正在泄漏所有节点。这将导致“未定义的行为”,并且在使用未定义的行为之后,任何事情都是可能的。感谢您的回答!从我读到的内容来看,我认为需要使用双指针。你能解释一下为什么这是正确的表格吗?我不是指向向量的第一个地址吗?另外,我使用了A=&A[0],所以在for结束后,我又回到了第一个地址。@AlexPostolache在main中使用A是正确的。正如@JonathanLeffler所指出的,您的AdjancyList也是错误的,因为A的类型适合元素的类型ADI*。您的A指向通过malloc分配的内容,但它被分配A=adjancencyList v;覆盖;。A=&A[0]相当于A=&*A+0,它相当于A=&*A,它相当于A=A,它没有努力。