|
|
|
@ -1,16 +1,76 @@
|
|
|
|
|
#include "../includes/structures.h"
|
|
|
|
|
#include "../includes/main.h"
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
j'ai essayer de faire comme le prof pour les noms de variable,
|
|
|
|
|
je crois que c completement loupe :)
|
|
|
|
|
*/
|
|
|
|
|
/*-------------recherches-------------*/
|
|
|
|
|
|
|
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
|
|
// Recherche d'une offre dans le tableau de travaux
|
|
|
|
|
// Retourne l'indice de l'offre dans le tableau si elle est trouvée, sinon retourne -1
|
|
|
|
|
int rechTravaux(char *travauxName, Offre *tabTravaux[])
|
|
|
|
|
{
|
|
|
|
|
//On utilise la taille max de travaux car travaux est un tableau constant, sa taille max est égale à sa taille logique.
|
|
|
|
|
int deb=0, end=tmaxTravaux-1, mid;
|
|
|
|
|
while(deb<=end)
|
|
|
|
|
{
|
|
|
|
|
mid = (deb+end) /2;
|
|
|
|
|
if (strcmp(travauxName, tabTravaux[mid]->travaux)==0)
|
|
|
|
|
return mid;
|
|
|
|
|
if (strcmp(travauxName, tabTravaux[mid]->travaux) < 0)
|
|
|
|
|
end=mid-1;
|
|
|
|
|
else
|
|
|
|
|
deb=mid+1;
|
|
|
|
|
}
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Recherche et garde la meilleure offre par travaux dans le tableau
|
|
|
|
|
// Affiche chaque offre gardee avec le devis ayant le prix le plus bas
|
|
|
|
|
void minTravaux(Offre *tabTravaux[])
|
|
|
|
|
{
|
|
|
|
|
int i;
|
|
|
|
|
ListeDevis l, minl;
|
|
|
|
|
for (i=0; i<tmaxTravaux; i++)
|
|
|
|
|
{
|
|
|
|
|
l=tabTravaux[i]->ldevis;
|
|
|
|
|
minl=l;
|
|
|
|
|
while(l)
|
|
|
|
|
{
|
|
|
|
|
if(l->dev.prix < minl->dev.prix)
|
|
|
|
|
{
|
|
|
|
|
l=delete(minl);
|
|
|
|
|
minl=l;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
l=delete(l);
|
|
|
|
|
l=l->suiv;
|
|
|
|
|
}
|
|
|
|
|
displayOffre(tabTravaux[i]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*---------------tri------------------*/
|
|
|
|
|
|
|
|
|
|
//on la met dans struct.c ?
|
|
|
|
|
|
|
|
|
|
// Libère la mémoire d'une liste de devis
|
|
|
|
|
void freeListeDevis(ListeDevis *ldevis)
|
|
|
|
|
{
|
|
|
|
|
ListeDevis current = *ldevis;
|
|
|
|
|
ListeDevis next;
|
|
|
|
|
|
|
|
|
|
while (current)
|
|
|
|
|
{
|
|
|
|
|
next = current->suiv;
|
|
|
|
|
free(current);
|
|
|
|
|
current = next;
|
|
|
|
|
}
|
|
|
|
|
*ldevis = NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// boucle principale (je la trouve pas jolie, est ce qu'on la met dans fusionMaillonDevis meme si ce sera plus somple a expliquer ?)
|
|
|
|
|
// Boucle principale de fusion de listes de devis
|
|
|
|
|
void fusionDevisElements(ListeDevis *R, int *tlogR, ListeDevis *S, int *tlogS, ListeDevis *mergedList, ListeDevis *last, int *k)
|
|
|
|
|
{
|
|
|
|
|
ListeDevis *current;
|
|
|
|
|
|
|
|
|
|
while (*tlogR > 0 && *tlogS > 0)
|
|
|
|
|
{
|
|
|
|
|
if (strcmp((*R)->dev.nomE, (*S)->dev.nomE) < 0)
|
|
|
|
@ -40,7 +100,7 @@ void fusionDevisElements(ListeDevis *R, int *tlogR, ListeDevis *S, int *tlogS, L
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// fin des iteration principales
|
|
|
|
|
// Gère les éléments restants après les itérations principales de fusion
|
|
|
|
|
void gestionElementsRestants(ListeDevis *mergedList, ListeDevis *last, ListeDevis *source, int *tlogSource, int *k)
|
|
|
|
|
{
|
|
|
|
|
while (*tlogSource > 0)
|
|
|
|
@ -60,7 +120,7 @@ void gestionElementsRestants(ListeDevis *mergedList, ListeDevis *last, ListeDevi
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// fusion de maillons
|
|
|
|
|
// Fusionne deux listes de devis triées en une seule liste triée
|
|
|
|
|
void fusionMaillonDevis(ListeDevis R, int tlogR, ListeDevis S, int tlogS, ListeDevis *T)
|
|
|
|
|
{
|
|
|
|
|
ListeDevis last;
|
|
|
|
@ -70,15 +130,14 @@ void fusionMaillonDevis(ListeDevis R, int tlogR, ListeDevis S, int tlogS, ListeD
|
|
|
|
|
last = NULL;
|
|
|
|
|
mergedList = NULL;
|
|
|
|
|
k = 0;
|
|
|
|
|
|
|
|
|
|
fusionDevisElements (&R, &tlogR, &S, &tlogS, &mergedList, &last, &k);
|
|
|
|
|
gestionElementsRestants (&mergedList, &last, &R, &tlogR, &k);
|
|
|
|
|
gestionElementsRestants (&mergedList, &last, &S, &tlogS, &k);
|
|
|
|
|
|
|
|
|
|
freeListeDevis(T);
|
|
|
|
|
*T = mergedList;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// tri fusion sur les struct
|
|
|
|
|
// Tri fusion sur une liste de devis
|
|
|
|
|
void triFusionListeDevis(ListeDevis *ldevis, int tlog)
|
|
|
|
|
{
|
|
|
|
|
ListeDevis p;
|
|
|
|
@ -96,57 +155,9 @@ void triFusionListeDevis(ListeDevis *ldevis, int tlog)
|
|
|
|
|
}
|
|
|
|
|
qTemp = p->suiv;
|
|
|
|
|
p->suiv = NULL;
|
|
|
|
|
|
|
|
|
|
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;
|
|
|
|
|
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(struct maillonDevis));
|
|
|
|
|
offre1.ldevis->dev = (Devis){"Devis6", "Adresse1", 100, 5};
|
|
|
|
|
offre1.ldevis->suiv = (ListeDevis)malloc(sizeof(struct maillonDevis));
|
|
|
|
|
offre1.ldevis->suiv->dev = (Devis){"Devis3", "Adresse3", 80, 3};
|
|
|
|
|
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);
|
|
|
|
|
|
|
|
|
|
triFusionListeDevis(&offre1.ldevis, tlog);
|
|
|
|
|
|
|
|
|
|
printf("\nApres le tri : \n");
|
|
|
|
|
afficherOffre(&offre1);
|
|
|
|
|
|
|
|
|
|
freeListeDevis(&offre1.ldevis, &tlog);
|
|
|
|
|
return (0);
|
|
|
|
|
}
|
|
|
|
|
*/
|