2013-02-22 3 views
0

Может ли кто-нибудь объяснить, какая разница между следующими объявлениями одного связанного списка в c? В частности, почему первая неверна?Как объявить отдельный связанный список в c?

typedef struct 
{ 
    char *data; 
    struct linkedlist *next; 
} linkedlist; 

против

typedef struct linkedlist 
{ 
    char *data; 
    struct linkedlist *next; 
} linkedlist; 

ответ

5

В первом случае компилятор достигает

struct linkedlist *next; 

и он не знает, что такое struct linkedlist есть.

Во втором случае вы указываете в начале описания структуры, что это struct linkedlist. Это делает компилятор счастливым, когда он позже встречает поле next.

+0

Почему компилятор (gcc в моем случае) не жалуется на определение структуры, но дайте мне несколько ошибок позже? – kaspersky

+0

Какие ошибки, точно? –

+1

Одна ошибка для команды «while (tmp-> next-> next)« дает мне «указатель разыменования неполного типа», где tmp является «связанным списком *», – kaspersky

1
typedef struct 
{ 
    ... 
} linkedlist; 

выше позволит вам быть в состоянии объявить переменные следующим образом:

linkedlist thisIsALinkedList; 

Но проблема это только анализируется компилятором в конце структуры. Поэтому, когда он достигает struct linkedlist *next, он не знает, что такое linkedlist (и даже если бы это было сделано, декларация все равно была бы неправильной, так как она должна была быть только linkedlist *next).