在C中声明二叉树

时间:2013-10-31 20:24:22

标签: c

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

3 个答案:

答案 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));