#include <iostream>
#include <cstdlib>
#include "Term.hpp"

Term::Term(double c, int e, Term* s)
{
   coef= c;
   expo= e;
   sgte= s;
}

Term*  Ins(Term* p, Term* t)
{
   if (t==NULL)
     return p;

   if (p==NULL)
      return t; 

   if (t->Coef()==0.0) {
       delete t;
       return p;
   }

   Term* v= p;
   Term* r= NULL;
   while (v!=NULL && v->Expo() >  t->Expo()) {
      r= v;
      v= v->Sgte();
   }
    
   if (r==NULL) {// v no avanzo, t va al frente
       if (v==NULL)
          return t;

       if (v->Expo() == t->Expo()) {
           double s= v->Coef() + t->Coef();
           if (s != 0.0)
               p=new Term(s, t->Expo(), v->Sgte());
           else
               p= v->Sgte();
           delete v;
           delete t;
           return p;
       } 
       else {
           t->Sgte()= p;
           return t;
       }
   }
   else {
       if (v==NULL) {
           r->Sgte()= t;
           return p;
       }

       if (v->Expo() == t->Expo()) {
           double s= v->Coef() + t->Coef();
           if (s != 0.0)
               r->Sgte()=new Term(s, t->Expo(), v->Sgte());
           else
               r->Sgte()= v->Sgte();
           delete v;
           delete t;
           return p;
       } 
       else {
           r->Sgte()= t;
           t->Sgte()= v;
           return p;
       }
   }
}

Term operator * (const Term& a, const Term& b)
{
    return Term( a.Coef() * b.Coef(), a.Expo() + b.Expo(), NULL);
}

