2017-08-31 13 views
0

ツリーデータ構造を含むプロジェクトを開始するためにここで見つけた次のコードで作業しています。この関数の理解に問題がある

struct node{ 

    int ID; 
    struct node* next; 
    struct node* child; 
}; 

typedef struct node node; 

node* new_node(int); 
node* add_sibling(node*, int); 
node* add_child(node*, int); 


int main() 
{ 
    int i; 
    node *root = new_node(0); 
    for (i = 1; i <= 3; i++) 
     add_child(root, i); 
} 

node * new_node(int ID) 
{ 
    node* new_node =(node*) malloc(sizeof(node)); 
    if (new_node) { 
     new_node->next = NULL; 
     new_node->child = NULL; 
     new_node->ID = ID; 
    } 

    return new_node; 
} 

node* add_sibling(node* n, int ID) 
{ 
    if (n == NULL) 
     return NULL; 

    while (n->next) 
     n = n->next; 

    return (n->next = new_node(ID)); 
} 

node* add_child(node* n, int ID) 
{ 
    if (n == NULL) 
     return NULL; 
    if (n->child) 
     return add_sibling(n->child, ID); 
    else 
     return (n->child = new_node(ID)); 
} 

私はC/C++の初心者であり、一般的にプログラミングしています。私は、add_child機能以外のコードについてはすべて理解していると思います。この関数はノードへのポインタを返すようですが、mainで呼び出されると、void関数であるかのように呼び出されるようです。私は、私はコードで実装をnew_nodeはvoid関数としてadd_child書くために呼び出されるか、またはどのようにこのように

*root = add_child(root,i); 

を関数を呼び出すと考えられますが、これらの変更の結果の両方のエラーで(しないように言及しているだろう見つけた作品です)。私は何が欠けていますか?

+1

あなたは値を返すメソッドを呼び出すことはできません。彼は価値を返しました。あなたの主人が何をしているのですか? – litelite

+0

著者がこのように書いたと思う理由はありますか? – user178831

+1

彼はメインで戻り値を使用する必要はありませんでしたが、他の状況では有用かもしれません。 – litelite

答えて

0

この関数は次のように書き換えられます。

node* add_child(node* n, int ID) 
{ 
    // For null pointer return null 
    if (n == NULL) 
    { 
     return NULL; 
    } 

    // If element has child add a sibling to that child 
    if (n->child) 
    { 
     node* sibling_for_child = add_sibling(n->child, ID); 
     return sibling_for_child; 
    } 
    else 
    { 
     // Otherwise just add element as a child 
     node* child_node = new_node(ID); 
     n->child = child_node; 
     return child_node; 
    } 
} 

割り当ての結果は、この連鎖割り当てのように割り当てられた値(*)です。

実際にある
int a, b; 
a = b = 3; 

a = (b = 3); 

または

b = 3; 
a = b; 
+0

ありがとう、コードを書き直した方がはるかに明確で、私はそれを使用します。私の混乱は、使用されていない機能の復帰に由来していましたが、上記のコメント者が私のためにそれをクリアしました。 – user178831

+0

これは、OPの関心事にどのように対処していますか?「メインで呼び出されると、ボイド関数のように呼び出されるようです」? – babon

+0

それはありません。この回答は、「私はadd_child関数以外のコードに関するすべてを理解していると思います」 – teivaz

関連する問題