Невозможно добавить термин в класс списка

Я пытаюсь создать класс полиномов. Термины каждого объекта должны быть отсортированы для удобства использования (от более высокого показателя к меньшему). Так что я делаю сортировку в 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

Решение

Eсть много здесь не так. Я собираюсь перечислить кое-что из того, что вижу, но не думаю, что поймаю все …

В вашем конструкторе по умолчанию вы устанавливаете root == NULL;, Не. Увидеть Вот для большего.

root = p.root; означает, что оба rootуказывают на тот же список! Это означает, что изменение одного изменит другое, что приведет к неприятным сюрпризам. Вам нужно создать глубокая копия.

Ты устанавливаешь root снова вернитесь к нулевому указателю и завершите функцию. Это равносильно извлечению мусорного мешка и установке его рядом с банкой с учетом того, что мусор очищен. У вас утечки памяти!

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

Yipes! Вы выделяете Term локально и дать root его адрес. Но после того, как эта функция заканчивается, tmp выходит за рамки и разрушается, оставляя root указывая на неверную ячейку памяти! Вам необходимо динамически распределять память, которая будет сохраняться в течение всего срока службы объекта.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]