我正在研究我教授的代码示例,以便更好地了解链接数据结构。
在我们的linked-list.c示例中,教授定义了一个类型Node,如下所示:
typedef struct node {
int data;
struct node *next;
} Node;
小写节点有什么意义?我的印象是你可以写,例如:
typedef struct {
int data;
struct node *next;
} Node;
然后使用Node作为自己的类型。它是否与以下事实有关:如果您不包含小写节点,那么当编译器评估代码时,它将无法理解“struct node * next”的含义?
答案 0 :(得分:16)
看一下这个宣言:
struct node {
int data;
struct node *next;
};
typedef struct node Node;
这可以合并为一个声明(简化声明):
typedef struct node {
int data;
struct node *next;
} Node;
答案 1 :(得分:10)
它是否与以下事实有关:如果你不包含小写
node
那么当编译器在评估代码时,它将无法理解“{{1 }}“?
是
struct node *next
中的node
是结构类型的标记。如果为结构提供标记,则可以在标记完成时引用该类型,因此在
struct node
typedef struct node {
int data;
struct node *next;
} Node;
声明成员struct node *next;
,它是指向正在定义的结构类型的指针。在next
结束定义之前,typedef名称Node
不可用。
如果省略标记,则在;
完成之前无法以任何方式引用所定义的类型,因此在
typedef
第typedef struct {
int data;
struct node *next;
} Node;
行声明了一个新的,不相关的,不完整的struct node *next;
类型,其struct
标记为node
。
这是有效的,但是next
的任何内容都是已知的(除非它在其他地方被定义),所以你不能使用struct node
指针而不将其转换为指向任何地方的完整类型的指针(不是到处都是,next
等仍然会有效。)
答案 2 :(得分:1)
他正在为节点定义临时名称,因为他正在使用一种众所周知的技术来避免在每个结构对象的声明上编写struct node
。
如果他愿意的话:
struct node {
int data;
struct node *next;
};
你将不得不使用:
struct node* node;
声明一个新节点。为了避免这种情况,你必须在以后定义:
typedef struct node Node;
为了能够声明如下对象:
Node* node;
最后:
typedef struct node {
int data;
struct node *next;
} Node;
除了struct node { ... };
之外,它只是typedef struct node Node;
的快捷方式。
答案 3 :(得分:0)
此处struct node
类似于int
因此
struct node {
int data;
struct node *next;
}NodeVar;
表示您声明了struct node的单个变量Node。
喜欢int intVar;
typedef是为了使你的代码易于理解。
这样当你使用
时typedef struct node Node;
您可以使用与
相同的声明Node NodeVar;
答案 4 :(得分:0)
考虑以下代码:
#include <stdio.h>
typedef struct {
int data;
struct node *next;
} Node;
int main()
{
Node a, b = {10, NULL};
a.next = &b;
printf("%d\n", a.next->data);
}
这不会编译。编译器不知道struct node
是什么,除了它存在。因此,您可以将结构中的定义更改为Node *next;
。 typedef在声明之前不在范围内,因此它仍然无法编译。答案很简单,就像他说的那样,在node
之后使用struct
标签,它运行正常。
答案 5 :(得分:0)
小写“节点”是一种结构类型...即结构节点{stuff}是包含东西的节点结构。
另一方面,大写“Node”是一个全新的数据类型,它指的是'struct node'
通常(尽管在C ++中我认为你可以),你不能在C程序中传递“节点”...例如作为函数的参数。相反,你必须传递一个'struct node'作为你的论点......
// this will throw a syntax error because "node" is not a data type,
// it's a structure type.
void myFunc( node* arg );
// while this will not because we're telling the compiler we're
// passing a struct of node
void myFunc( struct node* arg );
// On the other hand, you *can* use the typedef shorthand to declare
// passing a pointer to a custom data type that has been defined
// as 'struct node'
void myFunc( Node* arg );