2017-02-02 21 views
0

ここでは2つの構造体を使用しています。私は構造体のメンバーが構造体を指すように初期化する方法がわかりません。これが可能かどうかは分かりません。Cの構造体を指す構造体のポインティング・メンバー

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; 

私はセットのメンバーを初期化したいが、私はset resultのと同じアドレスを指すように result->rootを得るために行う必要があるかどうかはわかりません。

set* new_set() 
{ 
    set* result = malloc(sizeof(set)); 
    result -> root = NULL; // Not sure??? 
} 

私はrootへのポインタを取得します。

void someOther(set* s) 
{ 
    setNode* temp = s -> root; 
    //.... 
} 

ご質問があまりにも曖昧です。

Additional Info

私は2つの構造体が欲しいです。 1つはツリー[setNode]のノードとツリーのルートへのポインタと他のいくつかのメンバ(そのツリーのためのmutexのようなもの)を含む第2の構造体[セット]です。それは問題ではない。

問題:関数内で、私はsetNode* temp = someSet -> root;を持っているので、ツリーを越えることができるはずです。つまり、tempはsomeSetのルートを指す必要があります。では、new_set関数でresult -> rootに何を割り当てるべきですか?

+4

'__node'は2つの連続したアンダースコアを含むため、UBです。それをしないでください。 – Bathsheba

+10

@Bathsheba UBではなく、そのような名前は予約されています。 –

+0

質問はレイアウトから独立しています... –

答えて

0

空のセットには要素が含まれていません。セットがバイナリ検索ツリーで表される場合、NULLルートポインタがそれに適しています。

set* new_set() 
{ 
    set* result = malloc(sizeof(set)); 
    result -> root = NULL; // Yes, absolutely positively 100% sure 
    return s; // Don't forget! 
} 

ルートにポインタを取得する場合は、取得します。

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)); 
     ...   
    } 
} 
関連する問題