Я пытаюсь создать класс полиномов. Термины каждого объекта должны быть отсортированы для удобства использования (от более высокого показателя к меньшему). Так что я делаю сортировку в 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;
}
Eсть много здесь не так. Я собираюсь перечислить кое-что из того, что вижу, но не думаю, что поймаю все …
В вашем конструкторе по умолчанию вы устанавливаете root == NULL;
, Не. Увидеть Вот для большего.
root = p.root;
означает, что оба root
указывают на тот же список! Это означает, что изменение одного изменит другое, что приведет к неприятным сюрпризам. Вам нужно создать глубокая копия.
Ты устанавливаешь root
снова вернитесь к нулевому указателю и завершите функцию. Это равносильно извлечению мусорного мешка и установке его рядом с банкой с учетом того, что мусор очищен. У вас утечки памяти!
Term tmp = Term(expon, coeff, NULL);
Term *p = &tmp;
root = p;
Yipes! Вы выделяете Term
локально и дать root
его адрес. Но после того, как эта функция заканчивается, tmp
выходит за рамки и разрушается, оставляя root
указывая на неверную ячейку памяти! Вам необходимо динамически распределять память, которая будет сохраняться в течение всего срока службы объекта.
Других решений пока нет …