Files

83 lines
2.8 KiB
C
Raw Permalink Normal View History

2024-10-24 16:29:20 +02:00
/************************************************************************/
/** Files de priorité: implémentation d'une tas binaire par un tableau **/
/************************************************************************/
#ifndef BINHEAP_H_
#define BINHEAP_H_
#include "alloc.h"
#include <stdbool.h>
#include <stdio.h>
// On travaille avec des tas génériques: le type des valeurs n'est pas fixé
// Pour ce faire, les éléments du tas seront des pointeurs génériques (void *).
// Le tas ne contiendra donc pas directement les valeurs mais des pointeurs
// sur celles-ci.
//
// Puisque le type des valeurs n'est pas fixé, la fonction de comparaison qui
// sert à ordonner les éléments du tas est un paramètre de ce tas. On utilise
// pour cela des pointeurs de fonctions: un des champs du type sera un pointeur
// sur une fonction qui associe un Booléen à deux éléments de type void * (qui
// indique si le premier est considéré comme "plus petit" que le deuxième).
typedef struct {
// Tableau stockant des pointeurs vers chaque valeur du tas
void **array;
// Taille totale du tableau
int size_array;
// Taille du tas (nombres de case utilisées dans le tableau)
int size_heap;
// Pointeur sur la fonction de comparaison utilisée par le tas
bool (*fc)(void *, void *);
} binheap;
/*************************/
/* Fonctions auxiliaires */
/*************************/
/* La fonction de comparaison pour les tas d'entiers */
bool fcmp_int(void *x, void *y);
// Déjà écrite dans binheap.c
/* Fonctions de navigation dans un arbre représenté par un tableau */
int left_binheap(int i);
// Retourne l'indice du fils gauche du noeud à l'indice i
int right_binheap(int i); // Fils droit
// Retourne l'indice du fils droit du noeud à l'indice i
int parent_binheap(int i); // Parent
// Retourne l'indice du parent du noeud à l'indice i
bool isvalid_binheap(binheap *p, int i);
// Teste si l'indice i correspond à un noeud est valide dans le tas p
/************************/
/* Fonctions primitives */
/************************/
/* Création d'un tas vide */
binheap *create_binheap(bool (*)(void *, void *));
// Le paramètre est un pointeur de fonction
// Il faut lui donner l'adresse de la fonction de comparaison à utiliser
// Par exemple, pour créer un tas d'entier on appellera la primitive avec
// l'adresse de la fonction fcmp_int ci-dessus:
// p = create_binheap(&fcmp_int);
/* Suppression */
void delete_binheap(binheap *);
/* Test du vide */
bool isempty_binheap(binheap *);
/* Taille */
int getsize_binheap(binheap *);
/* Insertion d'une valeur */
void push_binheap(binheap *, void *);
/* Récupération du minimum sans le retirer */
void *peekmin_binheap(binheap *);
/* Récupération du minimum en le retirant */
void *popmin_binheap(binheap *);
#endif