程序应该生成一个图并将其邻居存储在邻接列表中。我在解析列表时收到 SEGFAULT
。这很奇怪,因为当我尝试一一访问该列表时,它工作正常。
我的代码:
int main(void)
{
typedef struct linkedList{
int vertice;
struct linkedList *next;
}LL;
typedef struct vertex{
int color;
int noOfNeighbours;
LL *adj;
}vertex;
int E, V;
scanf ("%d %d", &V, &E);
//printf ("%d %d", E, V);
int i, j; //loop variables
vertex arrOfVertices [V];
for (i=0; i<V; i++)
{
arrOfVertices[i].color=-1;
arrOfVertices[i].noOfNeighbours=-1;
arrOfVertices[V].adj = NULL;
}
printf ("Output is : \n");
int firstV, secondV;
for (i=0; i<E;i++)
{
scanf ("%d %d", &firstV, &secondV);
LL* temp = malloc (sizeof(LL));
temp -> vertice = secondV-1;
if (arrOfVertices[firstV-1].adj == NULL)
{
arrOfVertices[firstV-1].adj=temp;
arrOfVertices[firstV-1].adj->next=NULL;
}
else
{
temp->next=arrOfVertices[firstV-1].adj;
arrOfVertices[firstV-1].adj=temp;
}
}
//Printing the list function. This part strangely segfaults and I don't know why
for (j=0; j<V;j++)
{
LL* parser = arrOfVertices[j].adj;
// printf ("%d : Color: %d\n", i+1, arrOfVertices[i].color);
while (parser!=NULL)
{
printf ("%d\n", parser->vertice);
parser = parser->next;
}
}
return 0;
}
最佳答案
在您的代码中,您似乎想要定义一个大小为 V 的数组,其中 V 的实际值由用户输入。然而,在C中,编译器需要提前知道数组的大小。 C 可能允许您以任意顺序放置类型和变量声明,但这并不意味着这将是执行顺序。
如果必须使用数组,则需要提前设置数组的大小,并检查它对于输入的值是否足够大。或者,您需要创建一个指向顶点数组的指针。然后,在用户输入 V 后,您需要使用 malloc 和 sizeof(vertex) 构建用户要求的尽可能多的结构,就像您(?)在程序的后面部分中所做的那样。
附:正如 whoamI 提到的,您还将在 arrOfVertices[V].adj = NULL; 行中产生越界引用。 C 中的数组是从 0 开始的,因此如果 V 是 5,并且您(通过上述方法)生成了 5 个顶点,则必须引用最后一个顶点,如 arrOfVertices[4]。
关于c - 链接列表错误(语言: C),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21844960/