为什么第二个里面可以定义next的指针,而第一个不可以
typedef struct {
int data;
LNode *next;
}LNode;
struct LNode{
int data;
struct LNode *next;
};
为什么第二个里面可以定义next的指针,而第一个不可以
typedef struct {
int data;
LNode *next;
}LNode;
struct LNode{
int data;
struct LNode *next;
};
关注引自免费微信小程序:皆我百晓生
在C++中,typedef关键字用于为现有的数据类型创建一个新的名字(别名)。当你使用typedef时,它实际上是在声明一个类型别名,这与直接使用结构体名称是等效的。所以,第一种写法:
typedef struct {
int data;
LNode *next;
} LNode;
这里,首先定义了一个匿名的结构体,然后通过typedef将其命名为LNode。这样,在这个作用域内,LNode就相当于这个匿名结构体的名称,因此可以直接在内部定义next字段为指向自身类型的指针。
然而,第二种写法是标准的结构体定义方式,没有使用typedef。在这种情况下,你需要在结构体名称前加上struct关键字来指定类型,就像下面这样:
struct LNode{
int data;
struct LNode *next;
};
在这段代码中,每次提到next字段的类型时,都需要使用struct LNode *来明确指出它是LNode结构体的指针。这是因为在这个上下文中,只有通过struct关键字才能访问到LNode类型。如果你想要简化这一点,可以考虑添加一个typedef来创建一个别名,就像第一种写法那样。
如果你想让两种写法看起来更一致,可以给第二种写法也添加一个typedef,如下所示:
struct LNode{
int data;
struct LNode *next;
};
typedef struct LNode LNodeAlias; // 添加typedef,使写法更统一
这样,LNode和LNodeAlias都可以用来表示同一个结构体类型,但在内部定义字段时,可以直接使用next而不是struct LNode *next。