1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
| /* Note: <stdbool.h> existe */
#include <stdbool.h>
/*Sinon*/
typedef enum eBool { false, true } bool;
/*
Accesseurs const-correct pour FOURNISSEUR::Next
*/
FOURNISSEUR* GetSuivant(FOURNISSEUR *pChainon)
{
if(pChainon == NULL) { return NULL; }
return pChainon->Next;
}
FOURNISSEUR const * GetSuivantC(FOURNISSEUR const *pcChainon)
{
if(pcChainon == NULL) { return NULL; }
return pcChainon->Next;
}
FOURNISSEUR ** GetPtrSuivant(FOURNISSEUR ** ppChainon)
{
if(ppChainon == NULL) { return NULL; }
if(*ppChainon == NULL) { return NULL; }
return &(ppChainon[0]->Next);
}
/*
Fonctions de recherche
*/
typedef bool PREDICAT(intptr_t contexte, FOURNISSEUR const *pcChainon);
FOURNISSEUR const * TrouverC(FOURNISSEUR const * pcPremier, PREDICAT pred, intptr_t contexte)
{
FOURNISSEUR const *pcCourant;
if(pcPremier==NULL || pred==NULL) { return NULL; }
for(pcCourant = pcPremier ; pcCourant != NULL ; pcCourant=GetSuivantC(pcCourant))
{
if(pred(contexte, pcCourant))
return pcCourant;
}
return NULL;
}
FOURNISSEUR * Trouver(FOURNISSEUR * pPremier, PREDICAT pred, intptr_t contexte)
{
return (FOURNISSEUR*)TrouverC(pPremier, pred, contexte); //const_cast
}
FOURNISSEUR ** TrouverPtr(FOURNISSEUR ** ppPremier, PREDICAT pred, intptr_t contexte, bool dernierSiPasTrouve)
{
FOURNISSEUR **ppCourant;
if(ppPremier==NULL || pred==NULL) { return NULL; }
for(ppCourant = ppPremier ; ppCourant[0] != NULL ; ppCourant=GetPtrSuivant(ppCourant))
{
if(pred(contexte, *ppCourant))
return ppCourant;
}
if(dernierSiPasTrouve)
return ppCourant; /*Ceci pointe sur le pointeur nul à la fin de la liste*/
else
return NULL;
}
/*
Fonctions pour ajouter avant le premier fournisseur supérieur
*/
int Comparer(FOURNISSEUR const *pcGauche, FOURNISSEUR const *pcDroite)
{
int ret = strcmp(pcGauche->ville, pcDroite->ville);
if(ret != 0) { return ret; }
ret = strcmp(pcGauche->nomFournisseur, pcDroite->nomFournisseur);
if(ret != 0) { return ret; }
return 0;
}
bool SuperieurAContexte(intptr_t contexte, FOURNISSEUR const *pcChainon)
{
FOURNISSEUR const * pcReference = (FOURNISSEUR const *)contexte;
return Comparer(pcChainon, pcReference) > 0;
}
void InsererTrie(FOURNISSEUR ** ppPremier, FOURNISSEUR* aInserer)
{
FOURNISSEUR ** ppSuperieur;
if(ppPremier==NULL || aInserer==NULL) { return };
/*On cherche le premier fournisseur supérieur à aInserer, ou le pointeur nul final sinon*/
ppSuperieur = TrouverPtr(ppPremier, SuperieurAContexte, (intptr_t)aInserer, true);
/*On insère juste avant*/
aInserer->Next = *ppSuperieur;
*ppSuperieur = aInserer;
} |
Partager