Проблемы с моим полиномиальным классом (ошибки сегментации)
Итак, я сделал полиномиальный класс для школьного упражнения, но когда я его выполняю, я получаю ошибку сегментации. Если вы могли бы помочь, я буду благодарен, так как не могу найти что с ним не так. Я думаю, что, вероятно, ошибка в функции addTerm, но я не совсем уверен.
Вот код, ребята:
#include <cmath>
#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;
};
Term *first,*last;
int sz;
void copy(const Polynomial &p)
{
for(Term *t=p.first;t!=nullptr;t=t->next)
{
addTerm(t->exponent,t->coefficient);
}
}
void purge()
{
Term *p=first;
while(p!=nullptr)
{
Term *q;
q=p;
p=p->next;
delete q;
}
}
public:
Polynomial()
{
first=nullptr;
last=nullptr;
sz=0;
}
Polynomial(const Polynomial &p):first(nullptr),last(nullptr),sz(0)
{
copy(p);
}
~Polynomial(){purge();}
Polynomial & operator = (const Polynomial &p)
{
purge();
first=nullptr;
last=nullptr;
sz=0;
copy(p);
return *this;
}
void addTerm(int expon, int coeff)
{
int i;
Term *q=first;
Term *p=new Term(expon,coeff,first);
if(first==nullptr)
{
first=p;
p->next=nullptr;
return;
}
else if(q->exponent<p->exponent&&p==first)
{
p->next=first;
first=p;
return;
}
else if(q->exponent==p->exponent&&p==first)
{
q->coefficient=q->coefficient+p->coefficient;
return;
}
else
{
for(i=0;i<sz-1;i++)
{
if(q->next->exponent==p->exponent)
{
q->next->coefficient=q->next->coefficient+p->coefficient;
return;
}
else if(q->next->exponent<p->exponent)
{
p->next=q->next;q->next=p; return;
}
q=q->next;
}
}
if(i==sz-2) {q->next=p;last=p;p->next=nullptr;}
sz++;
}
double evaluate(double x)
{
int result=0;
Term *q=first;
while(q!=nullptr)
{
result+=(q->coefficient)*(pow(x,q->coefficient));
q=q->next;
}
return result;
}
friend Polynomial operator+ (const Polynomial &p, const Polynomial &q)
{
Polynomial l;
Term *P,*Q;
P=p.first;
Q=q.first;
while(P!=nullptr&&Q!=nullptr)
{
if(P->exponent>Q->exponent)
{
l.addTerm(P->exponent,P->coefficient);
P=P->next; continue;
}
if(P->exponent<Q->exponent)
{
l.addTerm(Q->exponent,P->coefficient);
Q=Q->next; continue;
}
if(P->exponent==Q->exponent)
{
l.addTerm(P->exponent,P->coefficient+Q->coefficient);
P=P->next; continue;
}
}
if(P==nullptr)
{
while(Q!=nullptr)
l.addTerm(Q->exponent,Q->coefficient);
Q=Q->next;
}
if(Q==nullptr)
{
while(P!=nullptr)
l.addTerm(P->exponent,P->coefficient);
P=P->next;
}
return l;
}
friend Polynomial operator* (const Polynomial &p, const Polynomial &q)
{
Polynomial r;
Term *P,*Q;
P=p.first;
Q=q.first;
for(int i=0;i<p.sz;i++)
{ Polynomial l;
for(int j=0;j<q.sz;j++)
{
l.addTerm(P->exponent+Q->exponent,(P->coefficient)*(Q->coefficient));
Q=Q->next;
}
r=r+l;
P=P->next;
}
return r;
}
friend ostream & operator << (ostream &out, const Polynomial &p)
{
Term *P;
P=p.first;
while(P!=nullptr)
{
if(P->exponent>1)
{
cout<<P->coefficient<<"x^"<<P->exponent<<" ";
P=P->next;
}
if(P->exponent==1)
{
cout<<P->coefficient<<"x ";
P=P->next;
}
if(P->exponent==0)
{
cout<<P->coefficient;
P=P->next;
}
}
return out;
}
};
int main() {
Polynomial p; // 0
p.addTerm(1, 3); // 3x
p.addTerm(2, 1); // x^2
p.addTerm(0, -1); // -1
Polynomial q(p); // x^2 + 3x - 1
q.addTerm(1, -3); // -3x
cout << "P(x) = " << p << endl;
cout << "P(1) = " << p.evaluate(1) << endl;
cout << "Q(x) = " << q << endl;
cout << "Q(1) = " << q.evaluate(1) << endl;
cout << "(P+Q)(x) = " << p+q << endl;
}