C中红黑树的简单结构定义

C中红黑树的简单结构定义,c,struct,binary-search-tree,red-black-tree,C,Struct,Binary Search Tree,Red Black Tree,多年来我一直不用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"

多年来我一直不用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\u black\u tree.c-o RBTree”进行编译。 GCC会这样说:“预期的’;“在声明列表的末尾”7次,或者“必须使用'struct'标记来引用类型…”,“预期的标识符…”。
您认为创建RBTree好吗?

在C中,定义结构的成员时不能赋值

而不是

struct T {
    int a = 1;
    int b = 2;
};
你需要像这样的东西

struct T {
    int a;
    int b;
};
...
struct T t = {.a = 1, .b = 2};
此外,如果要分配内存并同时将所有成员初始化为零,则可以使用
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 *)) ...

在C语言中,定义
struct

而不是

struct T {
    int a = 1;
    int b = 2;
};
你需要像这样的东西

struct T {
    int a;
    int b;
};
...
struct T t = {.a = 1, .b = 2};
此外,如果要分配内存并同时将所有成员初始化为零,则可以使用
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 *)) ...

struct Node*left=NULL对于
struct
成员的声明,这不是有效的C代码。清洗、漂洗、重复此代码中的所有类似情况。你最后的问题和这个错误没有什么关系;只要您首先精通该语言,就可以用您喜欢的任何语言实现RB树。建议您在函数
create\u node
struct node*left=NULL中设置默认值对于
struct
成员的声明,这不是有效的C代码。清洗、漂洗、重复此代码中的所有类似情况。你最后的问题和这个错误没有什么关系;可以用任何您喜欢的语言实现RB树,只要您首先精通该语言。建议您在函数
create_node
Thank you David中设置默认值,我发表了一条评论对您和所有人说“谢谢”,但似乎我不必写它……关于最后一部分,你是说我应该使用“void”,因为它不会强迫我保留“int”,但我可以使用我想要的“char,long int…”对吗?像struct{void key,void value….}一样,欢迎您。是的,当然你可以在结构中嵌入任何你想要的东西。谢谢你,大卫,我发表了一条评论对你和所有人说“谢谢”,但似乎我不必写它…关于最后一部分,你是说我应该使用“void”,因为它不强迫我保留“int”,但我可以使用我想要的“char,long int…”对吗?像struct{void key,void value….}一样,欢迎您。是的,当然你可以在结构中嵌入任何你想要的东西。