0

extractMin()このコードは、複数回呼び出すとクラッシュします。私はポインターに不慣れで、おそらく明らかなバグであるため、問題が関数のどこにあるのかが明らかな人もいると思います。<したがって、関数が演算子を使用して辞書編集上の最小値を取得し、その値をリンクリストから削除することになっていることを除いて、詳細に立ち入ることなく、それがリンクリストであることを知っていれば十分です。

string LinkedListPQueue::extractMin() {
    if (this->isEmpty()) throw ErrorException("Empty queue.");
    string front = LEX_HIGH;
    cell *old;

    for (int i = 0; i < this->size(); i++) {
        if (this->head->value < front) {
            front = this->head->value;
            old = this->head;
        }

        old = this->head;
        this->head = this->head->next;
    }

    logSize--;
    delete old;
    return front;
}



void LinkedListPQueue::enqueue(const string& elem) {
    cell *newCell = new cell;
    newCell->value = elem;
    newCell->next = NULL;
    if(this->isEmpty()) {
        this->head = this->tail = newCell;
        logSize++;

    } else {
        recurSort(newCell);
        this->tail->next = newCell;
        this->tail = newCell;
        logSize++;
    }
}
4

3 に答える 3

1

あなたheadは変更されますが、実行後にリセットされることはありません

リストを「壊す」のではなく、単に使用するiteratorsか、単に開始するポインターを追加して、このポインターを移動する必要があります。headhead

于 2013-01-12T19:32:35.540 に答える
1

の head メンバーを変更しているextractMin()ため、リストが壊れています。

于 2013-01-12T19:32:42.990 に答える
1

問題はこのサイクルにあります:

for (int i = 0; i < this->size(); i++) {
    if (this->head->value < front) {
        front = this->head->value;
        old = this->head;
    }

    old = this->head;
    this->head = this->head->next;
}

私には時代遅れのように思えますが、メモリリークも発生し、実行後にリストに単一の要素が含まれるようになります。

私にはこれらの2行のようです:

old = this->head;
this->head = this->head->next;

サイクルに入ってはいけません。関数ロジックはもう少し複雑にする必要があります。最小要素へのポインターを見つけ、その値をヘッドと交換してからヘッドを削除します。

于 2013-01-12T19:34:02.593 に答える