2013-02-22 25 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)。