|
|
|
@ -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);
|
|
|
|
|
}
|
|
|
|
|
*/
|
|
|
|
|
*/
|
|
|
|
|