#include "declarations.h"

liste *fonction_addition(liste *nombre1, liste *nombre2)
{
    str_chiffre *ptr_nb1;          
    str_chiffre *ptr_nb2;            
    str_chiffre *ptr_rslt;        
    char T_Q = 'T';                                     //l'addition normale de deux nombres ce fait en tete
    liste *resultat;


/// /////////////////    [ 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 = '+';                              //une addition de base donnera un signe '+'

    ptr_nb1 = nombre1->queue;                                 //
    ptr_nb2 = nombre2->queue;                                 // tous pointeurs à la fin
    ptr_rslt = resultat->queue;                                //
/// ///////////////////////////////////////////////////////////////////////////////////////////////////////



/// ////////////////////////////////       [ BOUCLE DE CALCUL EN PARCOURANT ]         ////////////////////////////////
    do
    {

        if (ptr_nb1!=NULL && ptr_nb2!=NULL)                                         //cas normal
        {
            ptr_rslt->chiffre = ptr_rslt->chiffre + ptr_nb1->chiffre + ptr_nb2->chiffre;  //on additionne 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 >= 10)                                           // cas ou il y a une retenue
            {
                ptr_rslt->chiffre = (ptr_rslt->chiffre)-10;
                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;
            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
        {
            ptr_rslt->chiffre = ptr_rslt->chiffre + ptr_nb1->chiffre;
            ptr_nb1 = ptr_nb1->prec;
            ptr_rslt = ptr_rslt->prec;
        }
    } while (ptr_nb1!=NULL || ptr_nb2!=NULL);

/// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    if (nombre1->signe == '-' && nombre2->signe == '-')
    resultat->signe = '-';



return resultat;
}
