【问题标题】:Declaring a binary tree in C在 C 中声明二叉树
【发布时间】:2013-10-31 20:24:21
【问题描述】:

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

【问题讨论】:

标签: c


【解决方案1】:

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

struct node *r;

或者这个:

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

正如评论中提到的,结构内部的节点引用仍然需要 struct 关键字,因为 typedef 尚不存在。但是现在你可以在没有struct 关键字的情况下使用node。

【讨论】:

  • +1。还值得一提的是,new node() 不是有效的 C。
  • 我认为您仍然需要在子指针的结构声明中明确指定struct node
  • 你是对的,你仍然需要 struct 关键字。我将编辑我的答案。
【解决方案2】:

任何时候你提到你的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));

【讨论】:

  • @simonc 您不取消引用结构,只有变量。 sizeof(node) 是记录的字节数。 sizeof(node*) 是指针的字节数。但是sizeof(*node)是编译错误。
【解决方案3】:

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

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

此外,我建议不要使用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;
};

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-20
    • 2021-12-04
    • 2010-12-30
    相关资源
    最近更新 更多