2017-06-19 7 views
0

私は教師からバイナリツリーを反映するC言語の関数を書くように求められています。それはツリーを逆転させることを意味します。 解決策が私には意味をなさないので、私はこの質問に苦労してきました。 我々が使用するデータ構造体は以下の通りです:このCコードはバイナリツリーを元の場所に戻す方法を教えてください。

typedef struct nodo { 

    int valor; 

    struct nodo *esq, *dir; 
} *ABin; 

、溶液がある:ここ

void mirror (ABin *a) { 

    ABin c = *a; 
    if (c == NULL); 

    else { 
     ABin e = c -> esq; 
     ABin d = c -> dir; 
     c -> esq = d; 
     c -> dir = e; 
     mirror (&(c -> esq)); 
     mirror (&(c -> dir)); 
    } 
} 

私の最大の懸念は、ポインタかの使用です。なぜ、私たちが関数を再帰的に呼び出すときにesqdirstruct nodo型へのポインタである場合、&を使用しなければならないのか理解できませんか?あなたはESQDIRを見ることができるようにあなたが唯一


struct node { 
     struct node *prev; 
     struct node *next; 
     int key; 
     char payload[123]; 
     }; 

void mirror(struct node *ptr) 
{ 
struct node *tmp; 

if (!ptr) return; 

tmp = node->prev; 
node->prev = node->next; 
node->next= tmp; 

mirror(node->prev); 
mirror(node->next); 
} 
+0

あなたは明確な質問がありません。あなたはタイトルに入れることができます。 – Raphael

+4

'typedef'は明らかに最大の混乱のために書かれています。 'ABin'は' struct nodo * 'なので、' ABin * 'パラメータは' struct nodo ** 'です。 (実際のコードでは絶対にしないでください) – Ryan

+2

'if(c == NULL); – ikegami

答えて

0

構造体nodoへのポインタです。

typedef struct nodo{} *ABinを使用すると、ABinタイプもstruct nodoへのポインタになります。

よう

ABinstruct nodo *(タイプ)と等価です。

したがって、関数void mirror (ABin *a)の場合、はポインタへのポインタになります。

parameter a is struct nodo** // pointer to a pointer 

あなたは、そのアドレスを渡す必要がありますので、ポインタ自体を変更する必要がありますあなたの機能。そのため、関数を&と呼びます。

0

(そのうちの一つがNULLであっても)ポインタを交換する必要が

+0

代わりに、もっと賢明には、コードが 'a'が指すものを変更しないので、' void mirror(ABin a) 'を使用します。' * a = ... 'という割り当てはありません。 –

0

ポインタのtypedefを作成しています。

typedef struct nodo* ABin; 

これは混乱を招いています。

void mirror(ABin*) 

void mirror(struct nodo**) 

と同じであると間接の余分な層には理由がありませんので、実際には、あなたを混同しているように見えました。あなたは

void mirror(ABin) 

にそれを変えることができるが、それは最初の場所でのポインタのためのtypedefsを避けるのがベストです。

typedef struct Nodo { 
    int valor; 
    struct Nodo* esq; 
    struct Nodo* dir; 
} Nodo; 

void mirror(Nodo* nodo) { 
    if (nodo == NULL) 
     return; 

    Nodo* tmp = nodo->esq; 
    nodo->esq = nodo->dir; 
    nodo->dir = tmp; 

    mirror(nodo->esq); 
    mirror(nodo->dir); 
} 
1

あなたの質問に、より高いレベルの答えは再帰的にすべてのノードの左と右のサブツリーを交換することにより、あなたは木の順序は不変逆ということです:クリーンアップ


通常、バイナリ検索ツリーは、すべての子孫が現在のノードより前に(または等しい)不変量を維持する一方で、すべての右子孫が現在のノードよりも後で(または等しい)順序付けを維持します。木。ツリー内のすべてのノードで左右のサブツリーを交換することで、ツリーの順序不変を逆にします。

ポインタインダイレクションのレベルについての質問としては、ミラー関数がABINポインタを取る良い理由はありません。 typedefでツリーノードへのポインタであるので、ABINを取るだけです。さらに良いことに、あなた(またはあなたの教師)は正当な理由なしに構造体へのポインタのtypedefを最初に作成しません。

関連する問題