3

C の二分探索木への挿入に問題があります。次のような二分木定義があります (行番号は無視してください)。

struct WordBT {
    char *term;
    struct WordBT *right;
    struct WordBT *left;
};

typedef struct WordBT* WordPtrBT;
WordPtrBT mainListBT;

そして私の挿入機能:

int addlistBT(char *term, char *file, WordPtrBT curr) {
    if (curr == NULL) {
        WordPtrBT temp =  (WordPtrBT)malloc(sizeof(WordPtrBT));
        temp->term = term;
        curr = temp;
        return 1;
    }

    int test = //some test;
    if (test == 0) {
        return 0;
    }
    if (test > 0) {
        addlistBT(term, file, curr->left);
    }
    if (test < 0) {
        addlistBT(term, file, curr->right);
    }
}

それから私は電話します

addlistBT(term, file, mainListBT);

プログラムの後半でセグ フォールトが発生します。gdb でデバッグすると、次のように表示されます。

                        curr = temp;
(gdb) p temp
$7 = (WordPtrBT) 0x60a2a0
(gdb) p curr
$8 = (WordPtrBT) 0x0
(gdb) p mainListBT
$9 = (WordPtrBT) 0x0
(gdb) n
93                      addfileBT(file, curr->file);
(gdb) p temp
$10 = (WordPtrBT) 0x60a2a0
(gdb) p curr
$11 = (WordPtrBT) 0x60a2a0
(gdb) p mainListBT
$12 = (WordPtrBT) 0x0

ここで私の質問は、mainListBT がポインターとして定義されているため、mainListBT にポインターが temp に割り当てられていないのはなぜですか? ありがとう

4

2 に答える 2

3

あなたのプログラムには複数のバグがあります。

まず、これと同等のことをしています:

void fn(int x) {
  x = 1;
}

int main() {
  x = 0;
  fn(x);
  // you expect x == 1 here, but you *should* expect 0.
}

into&xの代わりに渡す必要があるのと同様に、に渡す必要があります(そしてその署名を変更します) 。xfoo()&mainListBTaddlistBT()

2 番目の明らかなバグは、次の行です。

WordPtrBT temp =  (WordPtrBT)malloc(sizeof(WordPtrBT));

構造体にスペースを割り当てたい場合は、ポインターにスペースを割り当てます。そのはず

WordPtrBT temp =  malloc(sizeof(*temp));

また

WordPtrBT temp =  malloc(sizeof(struct WordBT));

(そして、呼び出しの結果を決してキャストしないでください)。malloc

于 2013-10-16T06:14:53.193 に答える
1

あなたがすべきこと: addlistBT(term, file, &mainListBT); を使用して呼び出します。次に、addlist 関数を次のように変更します。

 81 int addlistBT(char *term, char *file, WordPtrBT *curr){
 86         if(!(*curr)){
 87                 WordPtrBT temp =  (WordPtrBT)malloc(sizeof(struct WordBT));
 88                 temp->term = term;
 92                 *curr = temp;
 94                 return 1;
 95         }
 96         int test = //some test;
 97         if(test == 0){  return 0;}
101         if(test > 0){   addlistBT(term, file, &(*curr)->left);}
104         if(test < 0){   addlistBT(term, file, &(*curr)->right);}
107 }

いくつかのポインターマジック...

于 2013-10-17T01:56:41.387 に答える