2014-02-18 2 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()', считая, что это сработало, должно рассчитывать на * что-то *. – 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. Как упоминалось выше, вы также столкнетесь с ссылкой за пределами границ в строке arrOfVertices [V] .adj = NULL; Массивы в C основаны на 0, поэтому, если V равно 5, и вы (по приведенным выше методам) сгенерировали 5 вершин, вы должны обратиться к последней вершине, как arrOfVertices [4].

+0

Ошибка была в' arrOfVertices [V] .adj = NULL; ', это должно было быть arrOfVertices [i] .adj = NULL; Спасибо, в любом случае :) –

Смежные вопросы