【问题标题】:Simple Struct definition in C for Red Black TreeC语言中红黑树的简单结构定义
【发布时间】:2019-11-25 10:02:05
【问题描述】:

多年来我不使用 C 语言,现在我又需要它了。 我正在尝试构建一棵红黑树,但我一开始就卡住了,因为我错过了一些关于“结构”的东西。

请看一下我的“结构”声明,它们很简单。 这是 Red_black_tree.c 中包含的头文件

 #define BLACK 0 //defalut color
#define RED 1 //

struct Node {  //create a black node by default, to have a red one look at "create_red_node"
    struct Node *left = NULL;
    struct Node *right= NULL;
    int key = 0;
    int value = 0;
    char color = BLACK;
};

struct Root_t {
    struct Node* Root;
};

struct Node* create_node () {
    struct Node* black = (Node*) malloc (sizeof(Node));
    return black;
}

struct Node* create_red_node () {
    struct Node* red = create_node ();
    red->color=RED;
    return red;
}

Root_t* create_tree () {
    struct Root_t* fake=(Root_t*) malloc (sizeof(Root_t));
    struct fake->Root->left=create_red_node ();
    struct fake->Root->right=create_red_node ();
    return fake;
}

我用“gcc Red_black_tree.c -o RBTree”编译。 GCC 说类似:“预期的';'在声明列表末尾”7 次,或“必须使用 'struct' 标签来引用类型...”、“预期标识符...”。 你怎么看,创建RBTree好不好?

【问题讨论】:

  • struct Node *left = NULL; 这不是 struct 成员声明的有效 C 代码。清洗,冲洗,重复此代码中所有类似的事件。您的结束问题与该错误无关;只要您首先精通该语言,就可以用您喜欢的任何语言实现 RB 树。
  • 建议你在函数create_node中设置默认值

标签: c struct binary-search-tree red-black-tree


【解决方案1】:

在 C 中,您不能在定义 struct 的成员时进行分配

而不是

struct T {
    int a = 1;
    int b = 2;
};

你需要类似的东西

struct T {
    int a;
    int b;
};
...
struct T t = {.a = 1, .b = 2};

另外,你所有的成员都设置为0(NULL(void *)0的别名),当你想同时分配内存和初始化全部为零的时候可以使用calloc

struct Node* black = calloc(1, sizeof(*black)); // Dont cast malloc and friends

这里:

struct fake->Root->left=create_red_node();

,您不需要 struct 关键字,而是:

fake->Root->left=create_red_node();

另一个建议:不要在结构中硬编码红黑树的数据 (int key, value;),即使它可以工作,你最终会得到一个不可重用的容器,而是使用指向 void 的通用指针(void *data;) 和实现中比较函数的回调。

struct Node *insert(struct Node *root, int (*comparer)(const void *, const void *)) ...

【讨论】:

  • 谢谢你,大卫,我发表了一条评论,向你和所有人说“谢谢”,但似乎我不必写它......关于最后一部分,你是说我应该使用“void”,因为它不会强迫我保留“int”,但我可以使用我想要的东西,比如“char, long int....”,对吗?像 struct { void key, void value....}...
  • 不客气。是的,当然你可以在结构中嵌入任何你想要的东西。
猜你喜欢
  • 2012-12-24
  • 2012-06-03
  • 2015-12-31
  • 1970-01-01
  • 2011-02-04
  • 2022-07-30
  • 2010-12-14
  • 1970-01-01
  • 2011-03-19
相关资源
最近更新 更多