这是我正在使用的两个结构。我不确定如何初始化,以便struct的成员指向struct本身。我不确定这是否可行。
typedef struct __node
{
int value;
struct __node* left;
struct __node* right;
}setNode;
typedef struct __set {
setNode* root;
//mutex for this set (To be implemented)
}set;
我想初始化集合的成员,但不知道我该怎么做才能获得
result->root
指向与set result
相同的地址。
set* new_set()
{
set* result = malloc(sizeof(set));
result -> root = NULL; // Not sure???
}
我想获得指向root的指针。
void someOther(set* s)
{
setNode* temp = s -> root;
//....
}
对不起,如果问题太模糊了。
Additional Info
我想要两个结构。一个包含树[setNode]的节点,第二个结构包含指向树的根的指针和一些其他成员(如该树的互斥)[set]。这不是问题。
问题:在一个函数中,我有setNode* temp = someSet -> root;
,这样我就可以遍历树,即temp应该指向someSet的根。那么我应该在new_set函数中分配给result -> root
?
答案 0 :(得分:0)
空集不包含任何元素。如果集合由二叉搜索树表示,则NULL根指针适合于此。
set* new_set()
{
set* result = malloc(sizeof(set));
result -> root = NULL; // Yes, absolutely positively 100% sure
return s; // Don't forget!
}
如果你想获得指向root的指针,那就去吧。
void someOther(set* s)
{
setNode* temp = s -> root;
//!!!!
}
temp
为NULL时没有任何错误。你的功能必须能够处理。如果你想要一个递归遍历函数,写一个获得setNode*
参数的函数:
void someOther(set* s)
{
setNode* temp = s -> root;
someOtherDoThisActuallyIMeanItNow (temp);
}
void someOtherDoThisActuallyIMeanItNow (setNode* current)
{
...
if (current) { // <-- here we check that it's not NULL
...
someOtherDoThisActuallyIMeanItNow (current->left);
...
someOtherDoThisActuallyIMeanItNow (current->right);
} else {
// do whatever is appropriate for an empty tree/set
}
}
如果需要递归遍历并修改树的函数,请创建一个接受setNode**
参数的函数。
void someOtherWithMutation(set* s)
{
setNode* temp = s -> root;
someOtherWithMutationNow (&temp); // <---- here
}
void someOtherWithMutationNow (setNode** current) // <---- here
{
...
if (*current) { // <-- here we check that it's not NULL
...
someOtherDoThisActuallyIMeanItNow ((*current)->left);
...
someOtherDoThisActuallyIMeanItNow ((*current)->right);
...
if (...) {
free (*current);
*current = NULL;
}
} else {
// do whatever is appropriate for an empty tree/set
...
*current = malloc(sizeof(setNode));
...
}
}