在C语言中,使用typedef
来定义结构体类型及其指针的别名时,Node
和LinkList
的声明方式有所不同,这是因为你对它们的目的和用途有不同的设定。
首先,看一下你的代码:
typedef struct {
int data;
int lenght; // 注意:这里应该是 length,而不是 lenght,可能是一个拼写错误
struct Node *next; // 注意:这里需要使用 struct Node,因为此时 Node 还没有被定义为一个类型别名
} Node, *LinkList;
- Node的定义:
- 在这个结构体定义中,
Node
是结构体的标签(tag),它用于在结构体内部或外部引用这个结构体的类型。 - 在
typedef
的上下文中,Node
被同时定义为这个结构体的类型别名。这意味着在typedef
之后,你可以使用Node
来声明这种类型的变量,而不需要再写struct
关键字。
- 在这个结构体定义中,
- LinkList的定义:
*LinkList
是typedef
定义中的第二部分,它声明了一个新的类型别名LinkList
,这个别名是指向struct Node
的指针的类型。- 这里的
*
表示LinkList
是一个指针类型,指向struct Node
类型的对象。 - 因此,当你使用
LinkList
来声明变量时,你实际上是在声明一个指向Node
结构体的指针。
为什么Node
没有*
而LinkList
有*
呢?
Node
没有*
是因为你想要定义一个结构体的类型别名,而不是一个指针类型。这样,你就可以使用Node
来创建结构体的实例。LinkList
有*
是因为你想要定义一个指向结构体的指针的类型别名。这样,当你使用LinkList
来声明变量时,你得到的是一个指向结构体的指针,这在处理链表等数据结构时非常有用。
总结:
Node
是结构体的类型别名,用于创建结构体的实例。LinkList
是指向结构体的指针的类型别名,用于处理链表中的节点。
另外,请注意在结构体定义中next
成员的类型应该是struct Node *
而不是Node *
,因为在typedef
之前Node
还没有被定义为一个类型别名,它仍然是一个结构体标签。但在typedef
之后,你可以在结构体的定义中直接使用Node *
作为next
的类型,因为此时Node
已经被定义为一个类型别名了。不过,为了保持代码的清晰和一致性,许多程序员会选择在结构体定义中始终使用struct Node *
。