链接列表错误(语言:C)

时间:2014-02-18 05:18:44

标签: c list linked-list segmentation-fault singly-linked-list

程序应生成图形并将其邻居存储在邻接列表中。解析列表时我得到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;
}

2 个答案:

答案 0 :(得分:0)

在您的代码中,您似乎想要定义大小为V的数组,其中V的实际值由用户输入。但是,在C中,编译器需要事先知道数组的大小。 C可能允许您以任何顺序放置类型和变量声明,但这并不意味着这将是执行的顺序。

如果必须使用数组,则需要提前设置数组的大小,并检查输入的值是否足够大。或者,您需要创建一个指向顶点数组的指针。然后,在用户输入V之后,您需要使用malloc和sizeof(vertex)构建尽可能多的结构,就像您(?)在程序的后面部分所做的那样。

P.S。正如我提到的那样,你也将在行arrOfVertices [V] .adj = NULL中产生一个越界参考; C中的数组是从0开始的,所以如果V是5,并且你(通过上面的方法)生成了5个顶点,你必须引用最后一个顶点,如arrOfVertices [4]。

答案 1 :(得分:0)

错误发生在arrOfVertices[V].adj = NULL;,更改为arrOfVertices[i].adj = NULL;时有效。错字错误。唷!谢谢@Whoami和@WhozCraig指出来。 :)