2014-02-18 46 views
-2

程序应生成一个图并将其邻居存储在邻接列表中。解析列表时,我得到一个SEGFAULT。这很奇怪,因为当我尝试逐个访问列表时,它可以正常工作。链接列表错误(语言:C)

我的代码:

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; 
} 
+0

int firstV,secondV;似乎没有初始化,使用时没有赋值? –

+0

@Jerry_Y'scanf()',假设它有效,应该算作* something *。 – WhozCraig

+0

实际上并不重要,因为测试用例提供了E的值,并且它恰好具有E行。 –

回答

0

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

0

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

如果您必须使用数组,则需要预先设置数组的大小,并检查它是否足够大以便输入值。或者,您需要创建一个指向顶点数组的指针。然后,在用户输入V之后,您需要像在(?)程序的后面部分中那样使用malloc和sizeof(vertex)构建用户要求的结构。

p.s.正如whoamI提到的那样,你也会在行arrOfVertices [V] .adj = NULL; C中的数组是基于0的,所以如果V是5,并且您(通过上述方法)生成了5个顶点,则必须将最后一个顶点称为arrOfVertices [4]。

+0

错误是在'arrOfVertices [V] .adj = NULL;',它需要是arrOfVertices [i] .adj = NULL;谢谢,反正:) –