2017-06-13 6 views
-1

誰かが私のコードに間違っていると教えてもらえますか?
リンクリストの最後にノードを挿入するために、ノンリターン関数voidを作成したいとします。最後にリンクリストを挿入して再帰的に挿入する

void insert_tail_Recursively(struct node **phead, int key) { 
    if (*phead == NULL) { 
    Node*temp = malloc(sizeof(Node)); 
    temp->data = key; 
    temp->pLeft = temp->pRight = NULL; 
    *phead = temp; 
    } else { 
    Node*temp = malloc(sizeof(Node)); 
    temp->data = key; 
    temp->pLeft = temp->pRight = NULL; 

    /* data more than root node data insert at right */ 
    if ((temp->data > (*phead)->data) && ((*phead)->pRight != NULL)) 
     insert_tail_Recursively((*phead)->pRight, key); 
    else if ((temp->data > (*phead)->data) && ((*phead)->pRight == NULL)) { 
     (*phead)->pRight = temp; 

    } 

    /* data less than root node data insert at left */ 
    else if ((temp->data < (*phead)->data) && ((*phead)->pLeft != NULL)) 
     insert_tail_Recursively((*phead)->pLeft, key); 
    else if ((temp->data < (*phead)->data) && ((*phead)->pLeft == NULL)) { 
     (*phead)->pLeft = temp; 
    } 
    } 
} 
+0

この条件のtemp-> data < (*phead)->のデータはどういう意味ですか?それはどのように「リストの終わり」に関連していますか? –

+0

あなたはどんなエラーを出していますか? –

+1

リストに追加することを求めていますが、コードはツリーに追加することです。 'struct node'の定義はありません。追加した後でも、コードは正しくコンパイルされません。コンパイルエラーを修正してください。ここで意味があります。 – ArturFH

答えて

1

コードが複雑すぎるため、結果としてバグがあります。たとえば、メモリリークがあります。

次のような意味があるようです。

void insert_tail_Recursively(struct node **phead, int key) 
{ 
    if (*phead == NULL) 
    { 
     *phead = malloc(sizeof(struct node)); 
     (*phead)->data = key; 
     (*phead)->pLeft = (*phead)->pRight = NULL; 
    } 
    else 
    { 
     phead = key < (*phead)->data ? &(*phead)->pLeft : &(*phead)->pRight; 
     insert_tail_Recursively(phead, key); 
    } 
} 
+0

非常にきれいで簡潔なツリーの挿入コード、プラス1私から – BlueStrat

+0

これは問題ではありませんか?関数は渡された元のルートポインタを変更します。 –

+0

@Coldspeedはい、ツリーが空でポインタがNULLに等しい場合にルートを変更します。しかしそれは問題ではない。それは解決策です。 –

関連する問題