From 17fbc6a45ac65ddc93d03066824abe852d3a4172 Mon Sep 17 00:00:00 2001 From: Thibaud LA RIVIERE-GILLET Date: Sun, 17 Dec 2023 16:21:47 +0100 Subject: [PATCH] Update 'srcs/atomes.c' --- srcs/atomes.c | 205 ++++++++++++++++++++++++++++---------------------- 1 file changed, 113 insertions(+), 92 deletions(-) diff --git a/srcs/atomes.c b/srcs/atomes.c index b2429c1..83016a2 100644 --- a/srcs/atomes.c +++ b/srcs/atomes.c @@ -1,149 +1,170 @@ #include "../includes/recherche.h" #include "../includes/structures.h" -void fusionMaillonDevis(ListeDevis R, ListeDevis S, ListeDevis *T) -{ - ListeDevis pT; +/* + j'ai essayer de faire comme le prof pour les noms de variable, + je crois que c completement loupe :) +*/ - *T = NULL; - pT = *T; - while (R && S) +/*---------------------------------------------------------------------------*/ + +// boucle principale (je la trouve pas jolie, est ce qu'on la met dans fusionMaillonDevis meme si ce sera plus somple a expliquer ?) +void fusionDevisElements(ListeDevis *R, int *tlogR, ListeDevis *S, int *tlogS, ListeDevis *mergedList, ListeDevis *last, int *k) +{ + while (*tlogR > 0 && *tlogS > 0) { - if (strcmp(R->dev.nomE, S->dev.nomE) < 0) + ListeDevis *current; + if (strcmp((*R)->dev.nomE, (*S)->dev.nomE) < 0) { - if (!*T) - { - *T = (ListeDevis)malloc(sizeof(MaillonDevis)); - pT = *T; - } - else - { - pT->suiv = (ListeDevis)malloc(sizeof(MaillonDevis)); - pT = pT->suiv; - } - pT->dev = R->dev; - R = R->suiv; + current = R; + (*tlogR)--; } else { - if (!*T) - { - *T = (ListeDevis)malloc(sizeof(MaillonDevis)); - pT = *T; - } - else - { - pT->suiv = (ListeDevis)malloc(sizeof(MaillonDevis)); - pT = pT->suiv; - } - pT->dev = S->dev; - S = S->suiv; + current = S; + (*tlogS)--; } - pT->suiv = NULL; - } - while (R) - { - if (!*T) + if (!(*mergedList)) { - *T = (ListeDevis)malloc(sizeof(MaillonDevis)); - pT = *T; + *mergedList = (ListeDevis)malloc(sizeof(MaillonDevis)); + *last = *mergedList; } else { - pT->suiv = (ListeDevis)malloc(sizeof(MaillonDevis)); - pT = pT->suiv; + (*last)->suiv = (ListeDevis)malloc(sizeof(MaillonDevis)); + *last = (*last)->suiv; } - pT->dev = R->dev; - R = R->suiv; - pT->suiv = NULL; + (*last)->dev = (*current)->dev; + *current = (*current)->suiv; + (*last)->suiv = NULL; + (*k)++; } - while (S) +} + +// fin des iteration principales +void gestionElementsRestants(ListeDevis *mergedList, ListeDevis *last, ListeDevis *source, int *tlogSource, int *k) +{ + while (*tlogSource > 0) { - if (!*T) + if (!*mergedList) + *mergedList = *last = (ListeDevis)malloc(sizeof(MaillonDevis)); + else { - *T = (ListeDevis)malloc(sizeof(MaillonDevis)); - pT = *T; + (*last)->suiv = (ListeDevis)malloc(sizeof(MaillonDevis)); + *last = (*last)->suiv; } + (*last)->dev = (*source)->dev; + *source = (*source)->suiv; + (*last)->suiv = NULL; + (*k)++; + (*tlogSource)--; + } +} + +// cas en dehors de la taille logique +void gestionElementsHorsTailleLogique(ListeDevis *mergedList, ListeDevis *last, ListeDevis *source, int *k) +{ + while (*source) + { + if (!*mergedList) + *mergedList = *last = (ListeDevis)malloc(sizeof(MaillonDevis)); else { - pT->suiv = (ListeDevis)malloc(sizeof(MaillonDevis)); - pT = pT->suiv; + (*last)->suiv = (ListeDevis)malloc(sizeof(MaillonDevis)); + *last = (*last)->suiv; } - pT->dev = S->dev; - S = S->suiv; - pT->suiv = NULL; + (*last)->dev = (*source)->dev; + *source = (*source)->suiv; + (*last)->suiv = NULL; + (*k)++; } } -void freeListeDevis(ListeDevis *ldevis) +// fusion de maillons +void fusionMaillonDevis(ListeDevis R, int tlogR, ListeDevis S, int tlogS, ListeDevis *T) { - ListeDevis pos; - ListeDevis suiv; + int k; - pos = *ldevis; - while (pos) { - suiv = pos->suiv; - free(pos); - pos = suiv; - } - *ldevis = NULL; + k = 0; + ListeDevis last = NULL; + ListeDevis mergedList = NULL; + + fusionDevisElements (&R, &tlogR, &S, &tlogS, &mergedList, &last, &k); + gestionElementsRestants (&mergedList, &last, &R, &tlogR, &k); + gestionElementsRestants (&mergedList, &last, &S, &tlogS, &k); + gestionElementsHorsTailleLogique (&mergedList, &last, &R, &k); + gestionElementsHorsTailleLogique (&mergedList, &last, &S, &k); + + *T = mergedList; } -void triFusionListeDevis(ListeDevis *ldevis) { +// tri fusion sur les struct +void triFusionListeDevis(ListeDevis *ldevis, int tlog) +{ ListeDevis p; ListeDevis q; p = *ldevis; q = p->suiv; - if (!q) + if (tlog <= 1) return; -/* - 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) // while q-suiv fonctionnerai car q existe forcément si q-suiv aussi ? - { // q est la au cas ou la liste est vide + for (int i = 0; i < tlog / 2 - 1 && q && q->suiv; i++) + { p = p->suiv; q = q->suiv->suiv; } - q = p->suiv; + ListeDevis qTemp = p->suiv; p->suiv = NULL; - triFusionListeDevis(ldevis); - triFusionListeDevis(&q); - fusionMaillonDevis(*ldevis, q, ldevis); + + triFusionListeDevis(ldevis, tlog / 2); + triFusionListeDevis(&qTemp, tlog - tlog / 2); + + ListeDevis mergedList = NULL; + fusionMaillonDevis(*ldevis, tlog / 2, qTemp, tlog - tlog / 2, &mergedList); + + *ldevis = mergedList; +} + +//est ce qu'on supprime tout les elements de la liste chainee ou juste les elements de la longueure logique ? +void freeListeDevis(ListeDevis *ldevis, int *tlog) +{ + ListeDevis pos = *ldevis; + while (pos) + { + ListeDevis suiv = pos->suiv; + free(pos); + pos = suiv; + } + *ldevis = NULL; + *tlog = 0; } -/*---------------------------------------------------------------------*/ /* int main(void) { Offre offre1 = {"Travaux1", NULL}; - offre1.ldevis = (ListeDevis)malloc(sizeof(MaillonDevis)); + offre1.ldevis = (ListeDevis)malloc(sizeof(struct maillonDevis)); offre1.ldevis->dev = (Devis){"Devis6", "Adresse1", 100, 5}; - offre1.ldevis->suiv = (ListeDevis)malloc(sizeof(MaillonDevis)); + offre1.ldevis->suiv = (ListeDevis)malloc(sizeof(struct maillonDevis)); offre1.ldevis->suiv->dev = (Devis){"Devis3", "Adresse3", 80, 3}; - offre1.ldevis->suiv->suiv = NULL; - - Offre offre2 = {"Travaux2", NULL}; - offre2.ldevis = (ListeDevis)malloc(sizeof(MaillonDevis)); - offre2.ldevis->dev = (Devis){"Devis2", "Adresse2", 120, 7}; - offre2.ldevis->suiv = (ListeDevis)malloc(sizeof(MaillonDevis)); - offre2.ldevis->suiv->dev = (Devis){"Devis4", "Adresse4", 90, 4}; - offre2.ldevis->suiv->suiv = NULL; + offre1.ldevis->suiv->suiv = (ListeDevis)malloc(sizeof(struct maillonDevis)); + offre1.ldevis->suiv->suiv->dev = (Devis){"Devis8", "Adresse2", 120, 7}; + offre1.ldevis->suiv->suiv->suiv = (ListeDevis)malloc(sizeof(struct maillonDevis)); + offre1.ldevis->suiv->suiv->suiv->dev = (Devis){"Devis5", "Adresse5", 90, 4}; + offre1.ldevis->suiv->suiv->suiv->suiv = (ListeDevis)malloc(sizeof(struct maillonDevis)); + offre1.ldevis->suiv->suiv->suiv->suiv->dev = (Devis){"Devis2", "Adresse2", 110, 6}; + offre1.ldevis->suiv->suiv->suiv->suiv->suiv = NULL; + int tlog = 5; printf("Avant le tri : \n"); afficherOffre(&offre1); - afficherOffre(&offre2); - triFusionListeDevis(&offre1.ldevis); + triFusionListeDevis(&offre1.ldevis, tlog); printf("\nApres le tri : \n"); afficherOffre(&offre1); - afficherOffre(&offre2); - freeListeDevis(&offre1.ldevis); - freeListeDevis(&offre2.ldevis); + freeListeDevis(&offre1.ldevis, &tlog); return (0); } -*/ +*/ \ No newline at end of file