1

双方向リンク リストにノードを挿入したいと考えています。位置、多項式の新しい係数、およびそのパワーが渡されます。コンパイル エラーはありませんが、Linux (g++) でセグメンテーション エラーが発生し、Visual Studio で実行すると Access Violation Writing Location が発生します。

Program.exe の 0x00bd20ba で未処理の例外: 0xC0000005: アクセス違反書き込み場所 0xcdcdcdd9。

void Polynomial::insert( Term *pos, double newCoefficient, int power )
{
    Term *newTerm = new Term; // create a new node to insert

    // Link the new node to previous and next, given the position
    newTerm->prev = pos->prev;
    newTerm->next = pos;
    newTerm->prev->next = newTerm; // Here's where I'm getting the error
    newTerm->next->prev = newTerm;

    // change the coefficient and power
    newTerm->coefficient = newCoefficient;
    newTerm->power = power;
}

私は何を間違っていますか、どうすればこれを修正できますか?

4

5 に答える 5

1

pos->prevNULLまたは初期化されていない可能性があります。入力を使用する前に、入力を検証する必要があります...

于 2012-11-13T03:59:39.717 に答える
1

posが最初のノードである場合、 であるpos->prev必要がありますNULL。その場合、ステートメントnewTerm->prev->next = newTerm;はクラッシュしNULL->nextます。

posがリストの最初のノードであるかどうかを明示的に確認し、newNodeそれに応じて配置する必要があります。

// Link the new node to previous and next, given the position
newTerm->prev = pos->prev;
newTerm->next = pos;
if(pos->prev) newTerm->prev->next = newTerm;
newTerm->next->prev = newTerm;
于 2012-11-13T03:58:11.960 に答える
0

なぜ二重連結リストを自分で実装するのだろうか。とのメンバーを含むstructorを定義して、 の値の型として使用できます。これにより、多くのリスト操作 (要素の挿入や削除など) を無料で行うことができます。おまけとして、標準アルゴリズムで使用される適切な反復子 (位置ポインターの代わりに) が付属しています。classcoefficientpowerstd::liststd::list

クラスの残りの部分Polynomialが欠落しているため (単なる名前空間ではなくクラスですよね?)、より具体的なヘルプを提供することは困難です。

于 2012-11-13T07:49:43.443 に答える
0

通常、セグメンテーション違反は、NULL ポインターを逆参照しようとすると発生します。

ポインターを処理する際に NULL チェックを使用することは良い方法と考えられています。

于 2012-11-13T09:40:24.937 に答える
0

プログラムを実行するインスタンスで、pos がリストの最初のノードになるかどうかを確認してください。そうである場合、NULL ポインターのメンバーにアクセスしているため、セグメンテーション違反が発生します。

プログラミングを行うときは常に極端なケースを考慮し、それらに必要な条件を設定していることを確認してください。

于 2012-11-13T04:58:59.973 に答える