0

二分木とその BFS トラバーサルを実装しました。プログラムは以下です。

struct elemq{
    int ele;
    struct elemq *left;
    struct elemq *right;
};

struct que{
    struct elemq *ss;
    struct que *next;
}; 

void qinsert(struct elemq *ptr){
    struct que *node;
    node = (struct que *)malloc(sizeof(struct que));
    if(front == NULL && rear == NULL){
            node->ss = ptr;
            node->next = NULL;
            front = node;
            rear = node;
    }
    else{
            node->ss = ptr;
            node->next = NULL;
            rear->next = node;
            rear = node;
    }
}

struct elemq *qdelete(){
    if(front == NULL && rear == NULL){
            cout << "No elements to delete\n";
            exit(0);
    }
    struct elemq *dd = front->ss;
    struct que *ddd = front;
    front = front->next;
    free(ddd);
return dd;
}

int isempty(){
    if(front == NULL && rear == NULL){
            return 1;
    }
    else{
            return 0;
    }
}

void bfs(){
    qinsert(root);
    struct elemq *fff;
    while(!isempty()){
            fff = qdelete();
            cout << fff->ele  << "\n";
            if(fff->left != NULL){
                    qinsert(fff->left);
            }
            if(fff->right != NULL){
                    qinsert(fff->right);
            }
    }
}  

コードは長いですが、理解するのは非常に簡単です。elemq 構造は、ツリー内のノードの構造です。que は、bfs を実装するために使用しているキューです。q insert は要素をキューに挿入し、qdelete はキュー内の要素を削除します。isempty() は、キューが空かどうかを確認するためのものです。プログラムはルート要素を表示し、セグメンテーション違反を引き起こします。助けてください。かなり前から苦戦。

4

1 に答える 1

3

キューに要素が 1 つしかない場合、qdelete関数は正しく動作しません。

struct elemq *qdelete(){
    if(front == NULL && rear == NULL){
            cout << "No elements to delete\n";
            exit(0);
    }
    struct elemq *dd = front->ss;
    struct que *ddd = front;
    front = front->next;
    free(ddd);
return dd;
}

その場合、frontは に設定されますNULLが、まだ現在のd メモリrearを指しています。free

を追加

if (front == rear) {
    struct elemq *dd = front->ss;
    free(front);
    front = rear = NULL;
} else {
   // what you have
}

それを修正します。

于 2012-10-29T21:00:29.467 に答える