0

いくつかの整数を含む入力ファイルから整数を読み取り、バイナリ ツリーを作成しようとしています。なぜそれが (l==NULL) に常に入っているのかわかりません。2 回目は、読み取り値がルート値より大きいかどうかに応じて、左または右に移動する必要があります。どんな助けにも感謝します。ありがとう!

leaf* create_leaf(int i)
{
  leaf* l = (leaf*)malloc(sizeof(leaf));
  l->left = NULL;
  l->right = NULL;
  l->data = i;
}

leaf* l=NULL;
while(fscanf(input,"%d",&i) != EOF)
   {
       add_leaf(l,i);
    }

void add_leaf(leaf* l, int i)
{

   if(l == NULL)
  {
    printf("adding root\n"); 
    l = create_leaf(i);
  }

 else if(i <= l->data)
   {
    if(l->left == NULL)
       {
        l->left = create_leaf(i);}
     else {
      add_leaf(l->left,i); }   
   }
 else 
  {
    if(l->right == NULL)
      { 
    l->right = create_leaf(i); }
     else {
      add_leaf(l->right,i); }
    }
}
4

2 に答える 2

3

あなたのコードにはいくつかの問題があります。

何よりもまず、主な問題は、作成している葉を create_leaf 関数で返さないことです。

次に、malloc をキャストしないでください。これは不必要であり、問​​題を隠すことができます。

3 番目に、malloc のリターン コードを確認してください。オーバーコミットしているシステムで malloc が成功を示している場合でも、メモリが使用可能であるとは限りませんが、NULL を取得した場合は確実に問題が発生します。

于 2012-12-16T09:26:51.853 に答える
1

で再代入lすると、関数が戻ったときadd_leaf()に の新しい値がl呼び出し元に伝播されません。

次の 2 つのオプションがあります。

  • 二重ポインタ として渡すことができ、leaf** lそれに応じてコードを変更できます。
  • return関数から新しいことができlます。
于 2012-12-16T09:20:56.860 に答える