0

私はこのコードを持っています:

        typedef struct node
    {
        int data;
        struct node *left;
        struct node *right;
} node;

void Build (node *root , int i)
{
        if (i < 7)
    {
        root = (node *)malloc (sizeof(node));
        root->data = i;
        Build(root->left,2*i+1);
        Build(root->right,2*i+2);
    }
    else
        root = NULL;
}
void Print (node *root)
{
    if (root)
    {
        printf ("%d  ",root->data);
        Print(root->left);
        Print(root->right);
    }
}
void main()
{
    node *tree;

    Build(tree,0);
    Print(tree);
}

私が理解できない2つのこと、1. Build(tree,0) を渡すことができないのはなぜですか? 初期化されていないと書かれていますが、初期化されていないことを気にする必要はありません。必要なすべてのメモリをすぐに割り当てているので、新しく割り当てられたノードを指すようになります。

このコードを修正するにはどうすればよいですか? ありがとうございました!!!

4

2 に答える 2

3

node *to ツリーが初期化されていません。

node *tree;

コード行

root = (node *)malloc (sizeof(node));

rootのローカル コピーにメモリを割り当てます。Buildの関数スコープを離れると、ルートのコピーがスコープから外れます。メモリーリーク。

C ではすべてが値渡しされることを思い出してください。

ビルドにメモリを割り当てさせたい場合は、署名を次のようにする必要があります。

void Build (node **root , int i)

そのメソッドのコードは、*rootの代わりにを参照する必要がありrootます。

于 2012-07-18T23:30:49.720 に答える
2

パラメータは値で渡されます - メモリ内の場所は実際には渡されません。したがって、Build を呼び出すときは、たまたま初期化されていない tree の値を渡すだけです。Build 関数は、その値でローカル ルート変数を作成しますroot = ...。Build で設定すると、その未定義の値が新しい値で上書きされますが、その新しい値はまだローカル ルート変数にあるだけです。メインのツリー変数。

本当にやりたいことは、Build が新しく作成されたツリー ポインターを返すようにすることです。

node * Build(int i)
{
    node *root;
    ...
        root->left = Build(2*i+1)
    ...
    return root;
}

void main() 
{
    ...
    tree = Build(0);
    ...
}
于 2012-07-18T23:42:35.190 に答える