在c ++中,它是这样的:
struct node{
int value;
node *left;
node *right;
};
并且在功能上,当我需要它时,我会像这样使用它:
node *r;
r = new node();
r -> inf = 1;
r -> left = r -> right = null;
但这在C中如何运作? 我试过:
struct node{
int value;
node *left;
node *right;
};
但我得到错误:标识符节点未定义,所以我改变了:
struct node{
int value;
struct node *left;
struct node *right;
};
但现在,如果我尝试制作一个新变量:
node *r;
我收到错误:标识符节点在* r声明行处是未定义的, 我做错了什么?
答案 0 :(得分:2)
在C(而不是C ++)中,您仍然需要在任何地方使用struct关键字(或使用typedef)。试试这个:
struct node *r;
或者这个:
typedef struct node {
int value;
struct node *left;
struct node *right;
} node;
如注释中所述,结构内部的节点引用仍需要struct
关键字,因为typedef尚不存在。但现在您可以使用不带struct
关键字的节点。
答案 1 :(得分:0)
正如我在评论中所述,您不能像Zach建议的那样在结构中使用typedef
。您需要明确命名正在使用的结构:
struct node {
int value;
struct node *left;
struct node *right;
}
此外,我建议不要使用typedef
,除非您需要对数据类型进行opacify。仅仅为了少写字符来键入内容并不是一种好习惯。
但是,如果你真的很懒,那么typedef 有在结构声明之前完成,如下例所示:
/* Note that you can't use the same name for the struct and the typedef */
typedef struct node Node;
struct node {
int value;
Node *left;
Node *right;
};
然后,如果您尝试实现二叉树,则可能会实现相关方法。您肯定需要对节点的父节点进行引用,以便更容易插入和删除。记住这一点!
答案 2 :(得分:0)
只要您引用struct
,就必须将其称为:
struct node * r;
所以你的结构定义应如下所示:
struct node {
int value;
struct node * left;
struct node * right;
}
此外,new
关键字不在ANSI C中。由于您正在使用指针,因此需要使用malloc()
分配内存。所以
struct node * r = malloc(sizeof(struct node));
r->value = 0;
r->left = NULL;
r->right = NULL;
将分配内存并初始化其中的记录。
如果您不想将其称为struct node
作为类型,则可以使用typedef
:
typedef struct node {
int value;
struct node * left;
struct node * right;
} node;
虽然你仍然需要将记录中的指针引用为struct node
,因为它是在typedef
内声明的。现在您可以参考:
node * r = malloc(sizeof(node));