2012-11-28 22 views
3

由於某些原因,當我試圖做我的導數時,它只是做一個項的導數而不是整個多項式。多項式在鏈表中的導數

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

我有一個結構,然後還有一個類具有深拷貝構造函數和=構造函數的多項式。 在私有類,我有一個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^9的衍生我得到18x^8

我一直在尋找通過代碼,並有不知道爲什麼它只是在最後一個術語中這樣做,因爲它是一個while循環,應該從開始直到NULL並執行導數。

+2

你不妨考慮返回一個多項式填充這個導數。即不要xform這一個。只要走一遍,在計算它們時從返回多項式中添加項。 – WhozCraig

回答

4

你得到,因爲這兩條線的最後期限:

在其他條件

x = x -> next 

,並最終分配:

ptr = x; 

因此,這也泄漏記憶,因爲你之前分配的所有那些漂亮詞彙現在都在以太。無論如何,你都在泄漏舊的東西,所以無論如何這都需要重新思考。

我強烈建議,因爲你的多項式類支持完整拷貝構造和賦值操作,爲您營造一個衍生多項式這一個,並返回。如果來電者希望這個轉換,他們可以自己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(); 

無論如何,我希望這是有道理的。

+0

我看不出ptr = x有什麼不對,因爲ptr被x代替,x是整個多項式導數,x = x-> next轉到下一項 –

+1

@JackF x在* second之後指向什麼* term是在else子句中執行*'x = x-> next'之後立即創建的*。 – WhozCraig

+0

到下一個空節點? –

0
PolyNodeN* makeDerivate(PolyNodeN* poly) 
{ 
    PolyNodeN* head = new PolyNodeN(); 
    PolyNodeN* tmp = new PolyNodeN(); 
    int a = poly->exp; 

    int * results = new int[a]; 
    int * exponents = new int[a]; 

    for (int i = 0; i < a; i++) 
    { 
     results[i] = exponents[i] = 0; 
    } 
    for (poly; poly != nullptr; poly = poly->next) 
    { 
     results[poly->exp - 1] = poly->koef*poly->exp; 
     exponents[poly->exp - 1] = poly->exp - 1; 
    } 
    head = new PolyNodeN(exponents[a - 1], results[a - 1]); 
    tmp = head; 

    for (int i = a - 2; i >= 0; i--) 
    { 
     tmp->next= new PolyNodeN(exponents[i], results[i],tmp); 
     tmp = tmp->next; 
    } 
    tmp->next = nullptr; 
    return head; 
} 

哪個派生?簡單...

PolyNodeN* makeDerivate2(PolyNodeN* poly,int ext) 
{ 
    PolyNodeN* temp = new PolyNodeN(); 
    temp = temp->makeDerivate(poly); 
    for (int i = ext-1; i > 0; i--) 
     temp = temp->makeDerivate2(temp, i); 
    return temp; 
}