3

何らかの理由で、導関数を実行しようとすると、多項式全体ではなく、1つの項目の導関数が実行されます。

struct term{
    double coef;
    unsigned deg;
    struct term * next;
    };

構造体があり、ディープコピーコンストラクターと=コンストラクターを持つクラスPolynomialもあります。プライベートクラスでは、私はterm* ptr

これが派生物の私のコードです

void Polynomial::derivative (Polynomial *p){
    term *x;
    if ( ptr == NULL)
        return ;
    term *temp;
    temp = ptr;
    while (temp != NULL){
       if ( ptr == NULL){
            ptr = new term ;
            x = ptr ;
        }
        else{
            x -> next = new term ;
            x = x -> next ;
        }
        x-> coef = temp -> coef * temp -> deg;
        x-> deg = temp -> deg - 1;
        temp = temp -> next;

    }
    ptr=x;
}

だから私が導関数をしようとする3x^4 + 3x^4 + 6x^7 + 3x^4 + 3x^4 + 6x^7 + 2x^918x^8

私はコードを調べていましたが、それがwhileループであり、最初からNULLまで進み、導関数を実行する必要があるため、なぜ最後の用語でそれを実行するのかわかりません。

4

2 に答える 2

5

次の 2 行により、最終項を取得しています。

あなたのelse条件で:

x = x -> next

そしてあなたの最終的な任務:

ptr = x;

その結果、以前に割り当てたプリティタームはすべてエーテルにあるため、これもメモリリークを引き起こします。とにかく古いものを漏らしていたので、これは本当に再考する必要があります.

Polynomial クラスは完全なコピー構築と代入演算をサポートしているため、この多項式から新しい微分多項式を作成し、それを返すことを強くお勧めします。発信者がこれを変換したい場合は、自分で変換できます。poly = poly.derivative();

導関数発生器の例 (変圧器とは対照的に)。おまけとして、導関数を生成するときにすべての定数項を削除します。

Polynomial Polynomial::derivative() const
{
    Polynomial poly;

    const term *p = ptr;
    while (p)
    {
        if (p->deg != 0) // skip constant terms 
        {
            // add term to poly here (whatever your method is called)
            poly.addTerm(p->coef * p->deg, p->deg-1);
        }
        p = p->next;
    }
    return poly;
}

これにより、次のような生成が可能になります: (p1 は によって変更されないことに注意してくださいderivative()):

Polynomial p1;
... populate p1...
Polynomial p2prime = p1.derivative();

そして、本当に楽しいもののために:

Polynomial p1;
... populate p1...
Polynomial p2prime2 = p1.derivative().derivative();

とにかく、それが理にかなっていることを願っています。

于 2012-11-28T22:23:43.767 に答える