Update 'srcs/atomes.c'

master
parent 7d3f593387
commit 17fbc6a45a

@ -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);
}
*/
*/
Loading…
Cancel
Save