Проблемы с моим полиномиальным классом (ошибки сегментации) - PullRequest
0 голосов
/ 01 мая 2020

Проблемы с моим полиномиальным классом (ошибки сегментации)
Итак, я сделал полиномиальный класс для школьного упражнения, но когда я его выполняю, я получаю ошибку сегментации. Если вы могли бы помочь, я буду благодарен, так как не могу найти что с ним не так. Я думаю, что, вероятно, ошибка в функции 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;
}
...