#include <iostream>
#include <cstdlib>

using namespace std;

#include "Term.h"

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);
}

