diff --git a/srcs/atomes.c b/srcs/atomes.c index 7860016..f35434c 100644 --- a/srcs/atomes.c +++ b/srcs/atomes.c @@ -1,19 +1,17 @@ #include "../includes/recherche.h" #include "../includes/structures.h" -void fusionMaillonDevis(ListeDevis R, int tR, ListeDevis S, int tS, ListeDevis *T, int *tT) +void fusionMaillonDevis(ListeDevis R, ListeDevis S, ListeDevis *T) { ListeDevis pT; - int k; - + *T = NULL; pT = *T; - k = 0; - while (R && S) + while (R && S) { - if (strcmp(R->dev.nomE, S->dev.nomE) < 0) + if (strcmp(R->dev.nomE, S->dev.nomE) < 0) { - if (!*T) + if (!*T) { *T = (ListeDevis)malloc(sizeof(MaillonDevis)); pT = *T; @@ -42,7 +40,6 @@ void fusionMaillonDevis(ListeDevis R, int tR, ListeDevis S, int tS, ListeDevis * S = S->suiv; } pT->suiv = NULL; - k++; } while (R) { @@ -59,7 +56,6 @@ void fusionMaillonDevis(ListeDevis R, int tR, ListeDevis S, int tS, ListeDevis * pT->dev = R->dev; R = R->suiv; pT->suiv = NULL; - k++; } while (S) { @@ -68,7 +64,7 @@ void fusionMaillonDevis(ListeDevis R, int tR, ListeDevis S, int tS, ListeDevis * *T = (ListeDevis)malloc(sizeof(MaillonDevis)); pT = *T; } - else + else { pT->suiv = (ListeDevis)malloc(sizeof(MaillonDevis)); pT = pT->suiv; @@ -76,46 +72,46 @@ void fusionMaillonDevis(ListeDevis R, int tR, ListeDevis S, int tS, ListeDevis * pT->dev = S->dev; S = S->suiv; pT->suiv = NULL; - k++; } - *tT = k; } -void triFusionListeDevis(ListeDevis *ldevis, int *tlog) +void freeListeDevis(ListeDevis *ldevis) { + ListeDevis pos; + ListeDevis suiv; + + pos = *ldevis; + while (pos) { + suiv = pos->suiv; + free(pos); + pos = suiv; + } + *ldevis = NULL; +} + +void triFusionListeDevis(ListeDevis *ldevis) { ListeDevis p; ListeDevis q; - int tR; - int tS; - int i; - tR = *tlog / 2; - tS = *tlog - tR; p = *ldevis; - if (!p) - { - *tlog = 0; - return; - } - if (!(p->suiv)) - { - *tlog = 1; + q = p->suiv; + if (!q) return; - } - q = p; - for (i = 0; i < tR - 1; i++) +/* + la boucle qui suit cherche le milieu de la liste chainee + ca rend le code plus complexe + Pour une derniere version, il faudra la virer et la remplacer par une variable comme dans les versions precedentes du code +*/ + while (q && q->suiv) { - if (!q) - break; - q = q->suiv; + p = p->suiv; + q = q->suiv->suiv; } - if (!q) - return; - ListeDevis temp = q->suiv; - q->suiv = NULL; - triFusionListeDevis(ldevis, &tR); - triFusionListeDevis(&temp, &tS); - fusionMaillonDevis(*ldevis, tR, temp, tS, ldevis, tlog); + q = p->suiv; + p->suiv = NULL; + triFusionListeDevis(ldevis); + triFusionListeDevis(&q); + fusionMaillonDevis(*ldevis, q, ldevis); } /*------------------------affichage-----------------------------------*/ @@ -137,7 +133,6 @@ void afficherOffre(Offre *offre) } /*---------------------------------------------------------------------*/ - /* int main(void) { @@ -159,19 +154,14 @@ int main(void) afficherOffre(&offre1); afficherOffre(&offre2); - int tlog1 = 0; - triFusionListeDevis(&offre1.ldevis, &tlog1); - - int tlog2 = 2; - triFusionListeDevis(&offre2.ldevis, &tlog2); + triFusionListeDevis(&offre1.ldevis); printf("\nApres le tri : \n"); afficherOffre(&offre1); - printf("Taille logique : %d\n", tlog1); - afficherOffre(&offre2); - printf("Taille logique : %d\n", tlog2); + freeListeDevis(&offre1.ldevis); + freeListeDevis(&offre2.ldevis); return (0); } -*/ \ No newline at end of file +*/