struct — C ++ Polynomial Output дает 50% точности и 50% адреса памяти

Я пишу программу, которая реализует разреженные полиномы, с двумя глобальными структурами, определенными следующим образом:

//Global structs to represent a polynomial
struct Term {
int coeff;
int degree;
};

struct Node {
Term *term;
Node *next;
};

у класса есть личное Node *poly;

Я перегружаю * оператор, чтобы получить произведение двух полиномов.

Заголовочный файл для этого включает определение:

//Returns a polynomial that is the product of polynomial a and b
friend const Polynomial operator *(const Polynomial &a, const Polynomial &b);

а для функции я перебираю каждый связанный список, представляющий полином ( & b) до достижения значения nullptr, добавление степеней и умножение коэффициентов, создание нового члена, вставка его во временный полином и использование моего перегруженного оператора сложения для добавления временного полинома к возвращаемому полиному. Я проверил перегруженный оператор сложения и не получил эту проблему, поэтому я не думаю, что это является причиной этой проблемы. Проблема в том, что иногда я получаю верный ответ, например, в выходных данных первый запуск корректен, другой запуск выдает некоторые термины и некоторые адреса:

>PolynomialTester
Enter numbebr of terms of the polynomial: 3
coefficient degree
Enter term 1:   3 0
Enter term 2:   2 1
Enter term 3:   1 2

3 + 2*x^1 + 1*x^2

Enter numbebr of terms of the polynomial: 3
coefficient degree
Enter term 1:   3 0
Enter term 2:   2 1
Enter term 3:   1 2

3 + 2*x^1 + 1*x^2
9 + 12*x^1 + 7*x^2 + 6*x^3 + 1*x^4 //Correct
>Exit code: 0    Time: 33.22
>PolynomialTester
Enter numbebr of terms of the polynomial: 3
coefficient degree
Enter term 1:   3 0
Enter term 2:   2 1
Enter term 3:   1 2

3 + 2*x^1 + 1*x^2

Enter numbebr of terms of the polynomial: 3
coefficient degree
Enter term 1:   3 0
Enter term 2:   2 1
Enter term 3:   1 2

3 + 2*x^1 + 1*x^2
4109104 + 9 + 12*x^1 + 3*x^2 + 2*x^3 + 1*x^4 + 4108992*x^4108944 + 4109392*x^4109136 //Nope
>Exit code: 0    Time: 19.54

Функция, которую я использую для перегруженного * является :

const Polynomial operator *(const Polynomial &a, const Polynomial &b) {
//Computes the sum of two polynomials a + b
//Overloaded + operator

//The new polynomial that will be returned
Polynomial polyProduct;

Polynomial tempPoly;
//Temporary nodes to process
Node *tempA = a.poly;
Node *tempB;

while(tempA != nullptr) {
tempB = b.poly;
while(tempB != nullptr) {

int degree = tempA->term->degree + tempB->term->degree;
int coeff = tempA->term->coeff * tempB->term->coeff;
tempPoly.insert(Polynomial::newTerm(coeff, degree));
tempB = tempB->next;
}
polyProduct = polyProduct + tempPoly;
tempPoly.deletePoly();
tempA = tempA->next;
}

return polyProduct;
}

PS. deletePoly () проходит через многочлен и сначала удаляет член, а затем удаляет узел, пока он не станет нулевым.

Конструктор по умолчанию:

Term* Polynomial::newTerm(int c, int d) {
//Creates a new term
Term *newTerm = new Term;
newTerm->coeff = c;
newTerm->degree = d;
return newTerm;
}

Node* Polynomial::cons(Term *t, Node *p) {
//Creates a new node
Node *newNode = new Node;
newNode->term = t;
newNode->next = p;
return newNode;
}

Polynomial::Polynomial() {
//Creates the zero polynomial
poly = cons(newTerm(0, 0), nullptr);
}

PolynomialTester:

   int main() {
Polynomial newPoly;
Polynomial newPoly2;
Polynomial newPoly3;

newPoly.readPoly();
cout << "\n";
newPoly.printPoly();

cout << "\n";

newPoly2.readPoly();
cout << "\n";
newPoly2.printPoly();

newPoly3 = newPoly * newPoly2;
newPoly3.printPoly();
newPoly3.deletePoly();
newPoly2.deletePoly();
newPoly.deletePoly();
}

Оператор +

const Polynomial operator +(const Polynomial &a, const Polynomial &b) {
//Computes the sum of two polynomials a + b
//Overloaded + operator

//The new polynomial that will be returned
Polynomial polySum;
//Temporary nodes to process
Node *tempA = a.poly;
Node *tempB = b.poly;

//While neither node A or B is equal to the nullptr
while(tempA != nullptr && tempB != nullptr) {

int degreeA = tempA->term->degree;
int degreeB = tempB->term->degree;

if(degreeA < degreeB) {
polySum.insert(tempA->term);
tempA = tempA->next;
}

else if(degreeA > degreeB) {
polySum.insert(tempB->term);
tempB = tempB->next;
}

else {
int coeff = tempA->term->coeff + tempB->term->coeff;
int degree = degreeA;
polySum.insert(Polynomial::newTerm(coeff, degree));
tempA = tempA->next;
tempB = tempB->next;
}
}
//Incase one of the polynomials still has remaining terms
while(tempA != nullptr) {
polySum.insert(tempA->term);
tempA = tempA->next;
}
//Incase one of the polynomials still has remaining terms
while(tempB != nullptr) {
polySum.insert(tempB->term);
tempB = tempB->next;
}
//Removes any zero coeffiecient terms
//Possibly due to a positive and negative coefficient being added
polySum.remZeroCoeff();
return polySum;
}

Копировать конструктор:

Polynomial::Polynomial(const Polynomial& oP) {
//Constructs a deep copy of the Polynomial being passed

poly = nullptr;
//The list to copy
Node *toCopy = oP.poly;

while(toCopy != nullptr) {
insert(toCopy->term);
poly->next = toCopy->next;
toCopy = toCopy->next;
}
}

Перегруженный оператор присваивания, однако это в настоящее время закомментировано в моем коде, так как это только ухудшает ситуацию

    Polynomial& Polynomial::operator =(const Polynomial &a) {

//Check to see if it's passing itself
if(this == &a) {
return *this;
}

//Delete current polynomial
deletePoly();

//The poly to copy
Node *toCopy = a.poly;

while(toCopy != nullptr) {
poly = cons(toCopy->term, poly);
toCopy = toCopy->next;
}

//Return a reference to itself
return *this;
}

Может ли кто-нибудь помочь мне понять, почему я иногда получаю адреса в качестве результатов?

0

Решение

Строка tempPoly.deletePoly (); вызывал проблему, поэтому, чтобы повысить эффективность и решить проблему, я добавил условие в функцию вставки, которая проверяет, равна ли передаваемая степень слагаемой степени слагаемой в текущем полиноме, если это так, то просто добавьте коэффициенты этого термина и удалить термин после того, как он не нужен. Это избавило от необходимости выполнять любое удаление или перегрузку при добавлении в перегруженную * функцию и повысило эффективность.

0

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

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

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