无法将术语添加到列出的列表类中



我正在尝试创建一个多项式类别。每个对象的术语应进行排序以易于使用(从较高的指数到较小的指数(。因此,我在addTerm方法中进行分类,但是我在做正确的事情时遇到了一些麻烦。我要么创建一个无限的链接列表,要么没有正确排序

#include <iostream>
using namespace std;
class Polynomial {
protected:
    class Term {
    public:
        int exponent;
        int coefficient;
        Term *next;
        Term(int exp, int coeff, Term *n) {
            exponent = exp;
            coefficient = coeff;
            next = n;
        }
        friend class Polynomial;
    };
public:
    Polynomial() {
        root = NULL;
    }
    Polynomial(const Polynomial &p) {
        root = p.root;
    }
    ~Polynomial() {
        root = NULL;
    }
    void addTerm(int expon, int coeff) {
        Term *prev = root;
        Term *target = root;
        if (root == NULL) {
            Term tmp = Term(expon, coeff, NULL);
            Term *p = &tmp;
            root = p;
            return;
        }
        while (target!= NULL && target->exponent < expon) {
            prev = target;
            target = target->next;
        }
        if (prev == target){
            Term tmp = Term(expon, coeff, target;
            Term *p = &tmp;
            prev->next = p;
        }else{

        Term tmp = Term(expon, coeff, target);
        Term *p = &tmp;
        prev->next = p;
        }


    }

private:
    Term *root;
};
int main() {
    Polynomial q;
    q.addTerm(1, 4);
    q.addTerm(2, 3);
    q.addTerm(3, 4);
    //q.addTerm(1, 4);
    //q.addTerm(2, 4);
    // q.addTerm(2,4);
    //q.print();
    //cout << q;
}

这里有一个 lot 错误。我将列举一些我所看到的东西,但我认为我不会抓住一切...

1。不要使用NULL

在您的默认构造函数中,您设置了root == NULL;。不。请参阅此处的更多信息。

2。您的复制构造函数制作浅副本。

root = p.root;表示两个root的指向同一列表!这意味着修改一个将修改另一个,这将导致一些令人讨厌的惊喜。您需要创建一个深层副本。

3。您的破坏者什么都不会分解任何东西!

您再次将root设置为空指针并结束功能。这相当于将垃圾桶取出并将其放在罐子旁边并考虑清洁垃圾。您有内存泄漏!

4。您的指针都指向不良对象!

Term tmp = Term(expon, coeff, NULL);
Term *p = &tmp;
root = p;

yipes!您在本地分配Term,然后给出root的地址。但是在该功能结束之后,tmp脱离了范围并被破坏,而root指向无效的内存位置!您需要动态分配内存,这将持续到对象的寿命中。

最新更新