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…
Reference in new issue