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 并进行导数。

4

2 回答 2

5

由于这两行,您将获得最后一个学期:

在你的其他情况下:

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 回答
1
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;
}
于 2016-10-25T15:41:40.760 回答