#include "declarations.h"

liste *fonction_soustraction(liste *nombre1, liste *nombre2)
{
    str_chiffre *ptr_nb1;       //cour1
    str_chiffre *ptr_nb2;       //cour2
    str_chiffre *ptr_rslt;      //cour3
    str_chiffre *ptr_zeros;         //cour5
    int suite_de_zeros = 0;
    char T_Q = 'T';                                     //la soustraction normale de deux nombres ce fait en tete
    char plusmoins = 0;
    liste *resultat;
    int i=0;
    int cpt=0;

/// /////////////////////   [ DETERMINATION DU NOMBRE LE PLUS GRAND ]    ////////////////////////////////
    ptr_nb1 = nombre1->tete;
    ptr_nb2 = nombre2->tete;


    if (nombre1->longueur == nombre2->longueur)                         // LES DEUX NOMBRE ONT LE MEME NOMBRE DE DECIMALES
    {
       do
       {
            if(ptr_nb1->chiffre < ptr_nb2->chiffre)                        //comparaisons des nombres par leur plus grande decimale
            {                                                          //nombre2 est le plus grand
                ptr_nb1 = nombre2->queue;                                //inversion des deux nombres : le plus grand est toujours le "ptr_nb1"
                ptr_nb2 = nombre1->queue;                                //pour que 998-999 = -1 et pas 199
                plusmoins = '-';                                       //le signe du résultat sera - dans ce cas la
            }
            else if (ptr_nb1->chiffre > ptr_nb2->chiffre)
            {                                                          //nombre1 est le plus grand
                ptr_nb1 = nombre1->queue;                                //tous pointeurs ne sont pas inversés,
                ptr_nb2 = nombre2->queue;                                //donc mis à la fin normalement pour le calcul
                plusmoins = '+';                                       //le signe du résultat sera + dans ce cas la
            }

            else                                         //(ptr_nb1->chiffre == ptr_nb2->chiffre)
            {
                ptr_nb1 = ptr_nb1->suiv;                     //si les deux nombres sont égaux, on compare la decimale suivante
                ptr_nb2 = ptr_nb2->suiv;
            }
        }while (plusmoins==0 && ptr_nb1!= NULL && ptr_nb2!= NULL);
    }

    else if (nombre1->longueur > nombre2->longueur)                     // NOMBRE1 A PLUS DE DECIMALES
        {
            ptr_nb1 = nombre1->queue;                                //
            ptr_nb2 = nombre2->queue;                                // idem
            plusmoins = '+';                                       //
        }

    else if (nombre1->longueur < nombre2->longueur)
        {                                                               // NOMBRE2 A PLUS DE DECIMALES
            ptr_nb1 = nombre2->queue;                                //
            ptr_nb2 = nombre1->queue;                                // idem
            plusmoins = '-';                                       //
        }
/// ///////////////////////////////////////////////////////////////////////////////////////////////////////


/// /////////////////    [ CREATION DU NOMBRE "RESULTAT" PUIS INITIALISATION DES POINTEURS ]    ///////////


    if(nombre1->longueur > nombre2->longueur)
    resultat = fonction_creation_nombre_vide (nombre1->longueur);            //creation d'une liste de zeros
    else
    resultat = fonction_creation_nombre_vide (nombre2->longueur);            //creation d'une liste de zeros

    resultat->signe = plusmoins;
/// ////////////////////////////////       [ BOUCLE DE CALCUL EN PARCOURANT ]         ////////////////////////////////

    ptr_rslt = resultat->queue;                                // on se positionne au début du resultat

    do
    {
        if (ptr_nb1!=NULL && ptr_nb2!=NULL)                                         //cas normal
        {
            ptr_rslt->chiffre = ptr_rslt->chiffre + (ptr_nb1->chiffre - ptr_nb2->chiffre);  //on soustrait les deux chiffres des nombres

            if (ptr_rslt->prec == NULL)                                            //cas où la DERNIERE RETENUE EST EN TETE de liste
            {
                T_Q = 'T';
                fonction_creation_cellule(resultat,0,T_Q);                      //création d'une cellule en tete
                T_Q = 'Q';
            }

            if (ptr_rslt->chiffre < 0)                                           // cas ou il y a une retenue
            {
                  ptr_rslt->chiffre = 10-abs(ptr_rslt->chiffre);
                  ptr_rslt->prec->chiffre --;
            }
            ptr_nb1 = ptr_nb1->prec;                                                //
            ptr_nb2 = ptr_nb2->prec;                                                //déclalage des pointeurs d'un cran vers la tete
            ptr_rslt = ptr_rslt->prec;                                             //
        }


        else if (ptr_nb1 == NULL)                                                 //cas où le chiffre du haut EST NULL : on l'oublie
        {
            ptr_rslt->chiffre = ptr_rslt->chiffre + ptr_nb2->chiffre;                   //et on retire la retenue s'il y en a eut une au dernier tour
            ptr_nb2 = ptr_nb2->prec;
            ptr_rslt = ptr_rslt->prec;
        }

        else if (ptr_nb2 == NULL)                                                 //cas où le chiffre du haut EST NULL : on l'oublie
        {
            if(ptr_nb1->chiffre == 0)
            {
                ptr_zeros = nombre1->queue;

                do
                {if(ptr_zeros->chiffre!=0)
                 {suite_de_zeros = 1;}
                 ptr_zeros = ptr_zeros->prec;                       //parcours pour savoir s'il n'y a que des zeros
                }while (ptr_zeros!=NULL);

                if (suite_de_zeros == 1)
                {
                    if(ptr_rslt->chiffre != 0)
                    {
                        ptr_rslt->chiffre = 10-abs(ptr_rslt->chiffre);

                        if (ptr_rslt->prec == NULL)                                            //cas où la DERNIERE RETENUE EST EN TETE de liste
                        {   T_Q = 'T';
                            fonction_creation_cellule(resultat,0,T_Q);                      //création d'une cellule en tete
                            T_Q = 'Q'; }

                        ptr_rslt->prec->chiffre --;
                    }
                }
            }else {ptr_rslt->chiffre = ptr_nb1->chiffre + ptr_rslt->chiffre;}                   //et on retire la retenue s'il y en a eut une au dernier tour

            ptr_nb1 = ptr_nb1->prec;
            ptr_rslt = ptr_rslt->prec;
        }

    } while (ptr_nb1!=NULL || ptr_nb2!=NULL);
/// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////

return resultat;
}
