//multiplication2.c
#include <stdio.h>
#include <stdlib.h>
#include "multiplication.h"

/////////////////////////////////////////////////////////////////////////
//Crée le 22/11/2004                                                   //
//Par Balmes regis                                                     //
//    Becker sebastien                                                 //
//                                                                     //
//Objectif: Multiplier deux listes triées L1 et L2 et retourner le     //
//          resultat                                                   //
//                                                                     //
//                                                                     //
//Entrée: L1 et L2 de type  ptr_liste                                  //
//Sortie: Lo de type ptr_liste                                         //
/////////////////////////////////////////////////////////////////////////
void multiplication  (ptr_liste L1, ptr_liste L2, ptr_liste *Lo)
{

    ptr_liste newstruct;//temporaire pour une nouvelle structure
    ptr_liste temp,temp2;//temporaire de Lo
    ptr_liste tempL1=NULL;//temporaire de la liste chainé L1
    ptr_liste tempL2=NULL;//temporaire de la liste chainé L2
    ptr_liste L3=NULL; // deux listes temporaires
    ptr_liste L4=NULL;
    long k=0;
   
  
   
   
       tempL1=L1;

             while (tempL1!=NULL)
             {                
                    //liberation de memoir inutil de L3 et L4
                    while (L3!=NULL)
                    {
                      temp=L3;
                      L3=L3->suivant;
                      free (temp);  
                    } 
                    while (L4!=NULL)
                    {
                      temp=L4;
                      L4=L4->suivant;
                      free (temp);
                    }
                 // On supprime Lo et On met chacun de ses élémnts dans L3        
                    while (*Lo!=NULL)
                    {
                     temp2=*Lo;
                     newstruct=(ptr_liste)malloc(sizeof(list));
                     newstruct->suivant=NULL;
                     newstruct->exp=(*Lo)->exp;
                     newstruct->coef=(*Lo)->coef;
                     *(Lo)=(*Lo)->suivant;
                           if (L3==NULL)
                           {
                                L3=newstruct;
                                temp=L3; 
                           }
                           else
                           {
                                temp->suivant=newstruct;
                                temp=temp->suivant;
                           }
                           free(temp2);   
                    }
                    
                     tempL2=L2;//réinitialiser
                      while (tempL2!=NULL)
                       {
                             newstruct=(ptr_liste)malloc(sizeof(list));
                             newstruct->suivant=NULL;
                             newstruct->exp=(tempL1->exp) + (tempL2->exp);
                             newstruct->coef=(tempL1->coef)*(tempL2->coef);
                              
                              if (L4==NULL)
                              {
                              L4=newstruct;
                              temp=L4;
                              }
                              else
                              {
                                temp->suivant=newstruct;
                                temp=temp->suivant;
                              }
                              tempL2=tempL2->suivant;
                       }
                       k++;
                       tempL1=tempL1->suivant;
                       addition_pol(L3,L4,Lo); // on additionne les polynomes                                                
             }          
 
}
