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

时间:2018-03-29 18:35:55

标签: c++ oop linked-list abstract

我正在尝试创建一个多项式类。应该对每个对象的术语进行排序以便于使用(从较高的指数到较小的指数)。所以我在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;
}

1 个答案:

答案 0 :(得分:1)

这里有一个很多错误。我将通过我看到的一些内容进行列举,但我认为我不会抓住所有内容......

1。不要使用NULL

在默认构造函数中设置root == NULL;。别。有关详情,请参阅here

2。您的复制构造函数会生成浅层副本。

root = p.root;表示两个root都指向同一个列表!这意味着修改一个将修改另一个将导致一些令人讨厌的意外。您需要创建deep copy

3。你的析构函数不会释放任何东西!

再次将root设置回空指针并结束该功能。这相当于将垃圾袋取出并放在罐子旁边,并考虑清理垃圾。你有内存泄漏!

4。你的指针都指向坏对象!

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

商Yipes!您在本地分配Term并提供root地址。但是在该函数结束后,tmp超出范围并被销毁,使root指向无效的内存位置!您需要动态分配将在对象的生命周期中持续存储的内存。