【发布时间】: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()函数中,您没有正确初始化每个分配的相邻节点,并且您没有正确地将它们链接到列表中。实际上,除了分配的最后一个节点外,您正在泄漏所有内容。这会导致严重的“未定义行为”,使用未定义行为后一切皆有可能。