我正在尝试创建一个多项式类。应该对每个对象的术语进行排序以便于使用(从较高的指数到较小的指数)。所以我在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;
}
答案 0 :(得分:1)
这里有一个很多错误。我将通过我看到的一些内容进行列举,但我认为我不会抓住所有内容......
NULL
在默认构造函数中设置root == NULL;
。别。有关详情,请参阅here。
root = p.root;
表示两个root
都指向同一个列表!这意味着修改一个将修改另一个将导致一些令人讨厌的意外。您需要创建deep copy。
再次将root
设置回空指针并结束该功能。这相当于将垃圾袋取出并放在罐子旁边,并考虑清理垃圾。你有内存泄漏!
Term tmp = Term(expon, coeff, NULL);
Term *p = &tmp;
root = p;
商Yipes!您在本地分配Term
并提供root
地址。但是在该函数结束后,tmp
超出范围并被销毁,使root
指向无效的内存位置!您需要动态分配将在对象的生命周期中持续存储的内存。