指向struct的成员在C中构造自身

时间:2017-02-02 10:25:24

标签: c pointers struct

这是我正在使用的两个结构。我不确定如何初始化,以便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

1 个答案:

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