2017-05-22 8 views
0

私はpreorder tranversalを使ってバイナリツリーからリンクリストを作成しようとしています。 私はそれを行う際に非常に多くの問題を抱えています、私はいくつかの "解決策"を見ましたが、私はそれが好きではありませんでした!私は簡単なことを試しています。バイナリツリーからリンクされたリストを作成する(preorder tranversal)

これは私が今まで得たコードです:

typedef struct nodo { 
    int value; 
    struct nodo *left, *right; 
} *ABin; 

typedef struct lligada { 
    int value; 
    struct lligada *next; 
} *LInt; 

void preorder (ABin a, LInt * l) { 

    LInt r=*l,tmp; 
    tmp=r; 

    if (!a) { 
    *l=NULL; 
} 
    else { 
    r=malloc(sizeof(struct lligada)); 
    r->value=a->value; 
    r=r->next; 
    *l=tmp; 
    preorder (a->left,l); 
    preorder (a->right,l); 
    } 
} 

私は常に空のリストを取得しています!

答えて

3

if(!a){* l = NULL; }

このオールウェイズ* Lにnullを使用して、あなたの関数で行う最後のものは、すべての道を上に渡されることになります。

残りの問題も有している。

R = R->次の;

しかし、あなたは何にr->nextを設定することはありません。あなたはまずそれをしなくてはなりません。

また、最初にpreorder()と呼ぶとき、何かがあれば、*lを指していますか?おそらくLInt *を渡すのではなく、関数がLint *を返すようにするのがよいでしょう。(preorder()への内部呼び出しの後でリストに加わる)

+0

ああ、私の悪い!あなたが正しいです。 – Bruno

+0

最初はNULLを指しているはずです。 – Bruno

+0

私は大好きですが、宣言を変更することはできません。それは私の先生によって実装されました。 – Bruno

関連する問題