2013-02-22 22 views
0

任何人都可以解釋c中單個鏈表的下列聲明之間的區別是什麼?更具體地說,爲什麼第一個不正確?如何在c中聲明單獨的鏈表?

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

VS

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

回答

5

在第一種情況下,編譯達到

struct linkedlist *next; 

,它不知道struct linkedlist是什麼。

在第二種情況下,您在結構聲明開始處告訴它它是struct linkedlist。當它遇到next字段時,這使得編譯器很高興。

+0

爲什麼編譯器(在我的情況下gcc)不會抱怨結構定義,但稍後給我一些錯誤? – kaspersky 2013-02-22 11:22:59

+0

究竟是什麼錯誤? – 2013-02-22 11:23:22

+1

一個錯誤是指令「while(tmp-> next-> next)」給我「取消引用不完整類型的指針」,其中tmp是一個「linkedlist *」 – kaspersky 2013-02-22 11:25:58

1
typedef struct 
{ 
    ... 
} linkedlist; 

上面讓你能夠聲明變量如下:

linkedlist thisIsALinkedList; 

但問題是,這僅僅是由編譯器在結構的結尾解析。因此,當它達到struct linkedlist *next時,它不知道linkedlist是什麼(即使它的確如此,聲明仍然不正確,因爲它應該只是linkedlist *next)。