0

二分探索木を作成しようとしていますが、値を挿入しようとすると、より正確には NULL ポインターが関数に渡されると、しばらくフリーズしてからクラッシュします。コードは次のとおりです。

void create(int co, struct node **leaf){
 if(*leaf==0){
   (*leaf)=malloc(sizeof(**leaf));
   (*leaf)->val=co;
   (*leaf)->left=0;
   (*leaf)->right=0;
   }
 else if(co<(*leaf)->val){
   create(co, &(*leaf)->left);
   }
 else if(co>=(*leaf)->val){
   create(co, &(*leaf)->right);
   }
}

なぜそうするのかわかりません。説明できますか?

編集:関数の最初の呼び出しは次のようになります。

struct node *root;
 root=0;
 for(i=0;i<c;i++){
   create(f[i], &root);
   }

ここで、c は配列内の要素の数です。そして、これは構造体の定義です:

struct node{
        int val;
        struct node *left;
        struct node *right;
        };

したがって、問題はここに投稿したコードにはありません。コード全体をここで見つけることができます。質問全体を書き直して、コード全体をここに投稿する必要がある場合は、commnets で saz してください。できるだけ早く修正しようとします。

答えを見つけた実際に問題なく通過した後create、プログラムを台無しにした最後の 1 つの間違いを見つけることができました。でした*i++;。どうやら ++ は、値が指されているとうまく機能しません。書き直した後*i=*i+1;、ようやく動作するようになったので、私を助けてくれたすべての人に感謝し、最後の質問をしたいと思います: と の違いは何*i++;ですか*i=i+1;?

4

2 に答える 2

1

コードに問題はありません。ここでは、正常に実行され、目的の結果が得られていることがわかります。に取り組んでgcc 4.3.4 (C90/C99)gcc 4.7.2ます。

于 2012-12-17T17:13:35.290 に答える
1

私はあなたの構造体定義と挿入関数をそのまま取り、他のコードを取り、そのmain()ように関数にダンプしました:

int main()
{
    struct node *root;
    int i, c = 10;
    root=0;
    for(i=0;i<c;i++){
        create(i, &root);
    }
    return 0;
}

うまく機能しているようです。また、さまざまな順序付き要素をいくつか試しました。

int f[] = {6, 1, 9, 2, 0, 18, 2, -8, 10000, 5};

繰り返しますが、クラッシュはなく、正しい順序が得られます...

条件で使用する を確認しましたかc: i<chas f[]number of elements? を使用するだけで を削除できますc: sizeof(f)/sizeof(int)

この関数を失敗させる入力は何ですか? 失敗した正確なエラーメッセージは何ですか?

ツリーを「歩く」とき、値を出力する前に NULL をチェックしましたか?


コード全体を投稿した後、ここでクラッシュすることがわかります。

int *pole, i, count=3;
pole[0]=25;   <----

ポールにメモリを与えていないため、初期化されていないポインターを逆参照しています。

pole = malloc(3 * sizeof(int));

それを修正しますが、他にもあります。

次はここで死ぬ。

void getorder(struct node *leaf, int *f, int *i){
    if(leaf->left!=NULL){
        getorder(leaf->left, f, i);
     }
     f[*i]=leaf->val;  <-- this will kill you

j繰り返しますが、メモリを提供しないためです。

int *j;
...
*j=0;
getorder(root, f, j);
于 2012-12-17T17:38:14.447 に答える