0

最初のノードを削除すると、単一リンク チェーンの削除機能が機能しません。33 を削除しようとすると {33,40,50} があるとします。セグメンテーション違反が発生しますが、他の 2 つは正常に動作します。削除機能で何を台無しにしたかを確認するには、新鮮な目が必要だと思います。

削除機能

bool Set::remove(int X)
{
        bool Flag = false;
        Node * Prev = Head;
        Node * Curr = Head->Succ;
        //unsigned Z = 0;

        while(Curr->Item != X)
        {
                Prev = Curr;
                Curr = Curr->Succ;
        }
        Prev->Succ =Curr->Succ;
        delete Curr;
        Num--;
        Flag = true;
        return Flag;
}
4

5 に答える 5

1

リストの最後まで行ったかどうかを確認する必要があります。

また、2 番目の要素ではなく、最初の要素から開始する必要があります (この場合、リストを調べてさらに続行しようとします)。

于 2012-11-15T21:21:03.073 に答える
1

間違った場所から検索を開始しています:

から変更する:

    Node * Prev = Head;
    Node * Curr = Head->Succ;

に:

    Node * Prev = null;
    Node * Curr = Head;

しかし、segfault の本当の問題は、指定された要素がリンクされたリストに見つからない場合の終了条件のシナリオを考慮していないことです。

次のように終了条件を実装できます。

bool Set::remove(int X)
{
        Node * Prev = Head;
        Node * Curr = Head->Succ;
        while(Curr->Item != X)
        {
                Prev = Curr;
                Curr = Curr->Succ;
                if ( null == Curr ) {
                    // If you've reached the end of your
                    // linked list and haven't found the item
                    // yet, give up looking and return
                    return false;
                }
        }
        Prev->Succ =Curr->Succ;
        delete Curr;
        Num--;
        return true;
}

bool Flag注:不要なため、コードを少しクリーンアップして削除しました。

于 2012-11-15T21:21:49.943 に答える
1

Curr = Head->Succすでに 33 を過ぎている ( Curr->item40 はある)から始めるからだと思います。また、リストの最後にあるかどうかを確認することもありません。したがって、範囲外のメモリにアクセスしています。

于 2012-11-15T21:20:36.340 に答える
1

Curr 変数は 2 番目の場所から始まります。Head は最初の位置を指し、Curr は Head が指す位置 2 (2 番目の位置) を指します。これにより、無限ループが発生し、プログラムがクラッシュします。currこれのhead代わりに開始

于 2012-11-15T21:22:27.073 に答える
0

Curr が初期化されます。

Node * Curr = Head->Succ;

つまり、あなたが作るとき

while(Curr->Item != X)

「頭」の値をスキップしています。Curr->Item は 33 (先頭の値) になることはないため、最終的にリストの最後にある NULL ポインターに到達するまで、Succ に進みます。while でリストの最後に到達したかどうかを確認していないため、実行時にセグメンテーション違反が発生します

Curr->Item != X
OR
Curr = Curr->Succ;

初期化してみてください:

Node * Curr = Head;
于 2012-11-15T21:24:59.573 に答える