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
|
struct tas
{
vext vecteur;
int dernier_element;
int (*comparaison) (void *, void *);
void (*liberer)(void *);
void (*afficher)(void *);
bool inverser;
};
/*
dans vext.c
struct vext
{
void **vecteur;
unsigned int taille_physique;
unsigned int taille_rallongement;
unsigned int nombre_d_elements;
void (*liberer)(void *);
void (*afficher)(void *);
};
*/
bool
existeGauche(vext self, int i)
{
int gauche= 2*i+1;
return (self->vecteur[gauche] != NULL);
}
bool
existeDroit(vext self, int i)
{
int droit= 2*i+2;
return (self->vecteur[droit] != NULL);
}
static void
reorganiserDescendant(tas self, int i)
{
int pere= i;
int gauche = 2*i+1;
int droit = 2*i+2;
if (existeGauche(self->vecteur,pere))
{
int min = gauche;
if(existeDroit(self->vecteur,pere))
{
if (self->comparaison( vext_lire(self->vecteur,gauche),vext_lire(self->vecteur,droit)) < 0)
{
min=droit;
}
}
if(self->comparaison( vext_lire(self->vecteur,pere),vext_lire(self->vecteur,min)) < 0)
{
echanger(self,pere,min);
reorganiserDescendant(self,min);
}
}
} |
Partager