我正在尝试创建一个多项式类别。每个对象的术语应进行排序以易于使用(从较高的指数到较小的指数(。因此,我在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
指向无效的内存位置!您需要动态分配内存,这将持续到对象的寿命中。