0

在 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 声明行未定义,我做错了什么?

4

3 回答 3

2

在 C(相对于 C++)中,您仍然需要在任何地方使用 struct 关键字(或使用 typedef)。尝试这个:

struct node *r;

或这个:

typedef struct node {
    int value;
    struct node *left;
    struct node *right;
} node;

如评论中所述,结构内部的节点引用仍然需要struct关键字,因为 typedef 尚不存在。struct但是现在您可以使用没有关键字的节点。

于 2013-10-31T20:27:31.733 回答
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));
于 2013-10-31T20:40:36.980 回答
0

正如我在评论中所说,您不能typedef像 Zach 建议的那样在类型定义的结构中使用 a 。您需要明确命名正在使用的结构:

struct node {
    int value;
    struct node *left;
    struct node *right;
}

此外,我建议不要使用 a typedef,除非您需要不透明的数据类型。仅仅为了少写字符而对事物进行类型定义并不是一个好习惯。

不过,如果你真的很懒,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;
};

然后,如果您尝试实现二叉树,您可能会实现相关方法。您肯定需要对节点的父节点的引用以使插入和删除更容易。记在心上 !

于 2013-10-31T20:39:24.420 回答