forked from Arayve/07-heap
-
Notifications
You must be signed in to change notification settings - Fork 0
/
heap.h
89 lines (71 loc) · 2.87 KB
/
heap.h
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
#ifndef HEAP_H
#define HEAP_H
#include <stdbool.h> /* bool */
#include <stddef.h> /* size_t */
/* Prototipo de función de comparación que se le pasa como parámetro a las
* diversas funciones del heap.
* Debe recibir dos punteros del tipo de dato utilizado en el heap, y
* debe devolver:
* menor a 0 si a < b
* 0 si a == b
* mayor a 0 si a > b
*/
typedef int (*cmp_func_t) (const void *a, const void *b);
/* Función de heapsort genérica. Esta función ordena mediante heap_sort
* un arreglo de punteros opacos, para lo cual requiere que se
* le pase una función de comparación. Modifica el arreglo "in-place".
* Nótese que esta función NO es formalmente parte del TAD Heap.
*/
void heap_sort(void *elementos[], size_t cant, cmp_func_t cmp);
/*
* Implementación de un TAD cola de prioridad, usando un max-heap.
*
* Notar que al ser un max-heap el elemento mas grande será el de mejor
* prioridad. Si se desea un min-heap, alcanza con invertir la función de
* comparación.
*/
/* Tipo utilizado para el heap. */
typedef struct heap heap_t;
/* Crea un heap. Recibe como único parámetro la función de comparación a
* utilizar. Devuelve un puntero al heap, el cual debe ser destruido con
* heap_destruir().
*/
heap_t *heap_crear(cmp_func_t cmp);
/*
* Constructor alternativo del heap. Además de la función de comparación,
* recibe un arreglo de valores con que inicializar el heap. Complejidad
* O(n).
*
* Excepto por la complejidad, es equivalente a crear un heap vacío y encolar
* los valores de uno en uno
*/
heap_t *heap_crear_arr(void *arreglo[], size_t n, cmp_func_t cmp);
/* Elimina el heap, llamando a la función dada para cada elemento del mismo.
* El puntero a la función puede ser NULL, en cuyo caso no se llamará.
* Post: se llamó a la función indicada con cada elemento del heap. El heap
* dejó de ser válido. */
void heap_destruir(heap_t *heap, void destruir_elemento(void *e));
/* Devuelve la cantidad de elementos que hay en el heap. */
size_t heap_cantidad(const heap_t *heap);
/* Devuelve true si la cantidad de elementos que hay en el heap es 0, false en
* caso contrario. */
bool heap_esta_vacio(const heap_t *heap);
/* Agrega un elemento al heap. El elemento no puede ser NULL.
* Devuelve true si fue una operación exitosa, o false en caso de error.
* Pre: el heap fue creado.
* Post: se agregó un nuevo elemento al heap.
*/
bool heap_encolar(heap_t *heap, void *elem);
/* Devuelve el elemento con máxima prioridad. Si el heap esta vacío, devuelve
* NULL.
* Pre: el heap fue creado.
*/
void *heap_ver_max(const heap_t *heap);
/* Elimina el elemento con máxima prioridad, y lo devuelve.
* Si el heap esta vacío, devuelve NULL.
* Pre: el heap fue creado.
* Post: el elemento desencolado ya no se encuentra en el heap.
*/
void *heap_desencolar(heap_t *heap);
void pruebas_heap_alumno(void);
#endif // HEAP_H