minheap.c
1 #define _CRT_SECURE_NO_WARNINGS
2 #include "minheap.h"
3 
4 #include <string.h>
5 #include <stdlib.h>
6 
7 /*****************************************************************************/
8 /* Node & Primitives */
9 /*****************************************************************************/
10 
11 int HeapLeft(int i) {
12  return 2 * i + 1;
13 }
14 
15 int HeapRight(int i) {
16  return 2 * i + 2;
17 }
18 
19 int HeapParent(int i) {
20  return (i - 1) / 2;
21 }
22 
23 bool HeapIsEmpty(const Heap *h) {
24  return h->size == 0;
25 }
26 
28  Heap *h = malloc(1 * sizeof(Heap));
29  h->size = 0;
30  h->data = NULL;
31  return h;
32 }
33 
34 void HeapMinInsertNode(Heap *h, const ElemType *e) {
35  h->size++;
36  h->data = realloc(h->data, sizeof(ElemType)*h->size);
37 
38  h->data[h->size - 1] = ElemCopy(e);
39 
40  HeapMinMoveUp(h, (int)h->size - 1);
41 }
42 
43 ElemType *HeapGetNodeValue(const Heap *h, int i) {
44  if (!h || i >= (int)h->size) {
45  printf("ERROR: 'HeapGetNodeValue()' si sta provando ad accedere ad un nodo che non fa parte dello heap.\n");
46  exit(1);
47  }
48  else {
49  return &h->data[i];
50  }
51 }
52 
53 void HeapMinMoveUp(Heap *h, int i) {
54  while (i != 0 && ElemCompare(HeapGetNodeValue(h, i), HeapGetNodeValue(h, HeapParent(i))) < 0) {
55  ElemSwap(HeapGetNodeValue(h, i), HeapGetNodeValue(h, HeapParent(i)));
56  i = HeapParent(i);
57  }
58 }
59 
60 void HeapMinMoveDown(Heap *h, int i) {
61  int l, r, smallest = i;
62  bool done;
63  do {
64  done = true;
65  l = HeapLeft(i);
66  r = HeapRight(i);
67 
68  if ((l < (int)h->size) && ElemCompare(HeapGetNodeValue(h, l), HeapGetNodeValue(h, smallest)) < 0) {
69  smallest = l;
70  }
71 
72  if ((r < (int)h->size) && ElemCompare(HeapGetNodeValue(h, r), HeapGetNodeValue(h, smallest)) < 0) {
73  smallest = r;
74  }
75 
76  if (smallest != i) {
77  ElemSwap(HeapGetNodeValue(h, i), HeapGetNodeValue(h, smallest));
78  i = smallest;
79  done = false;
80  }
81 
82  } while (!done);
83 }
84 
85 void HeapDelete(Heap *h) {
86  for (size_t i = 0; i < h->size; ++i) {
87  ElemDelete(&h->data[i]);
88  }
89  free(h->data);
90  free(h);
91 }
92 
93 /*****************************************************************************/
94 /* Non Primitives */
95 /*****************************************************************************/
96 
97 void HeapWrite(const Heap *h, FILE *f) {
98  fprintf(f, "[");
99  for (int i = 0; i < h->size; ++i) {
100  ElemWrite(HeapGetNodeValue(h, i), f);
101  if (i != h->size - 1) {
102  fprintf(f, ", ");
103  }
104  }
105  fprintf(f, "]\n");
106 }
107 
108 void HeapWriteStdout(const Heap *h) {
109  HeapWrite(h, stdout);
110 }
HeapMinInsertNode
void HeapMinInsertNode(Heap *h, const ElemType *e)
La funzione HeapMinInsertNode() aggiunge un nodo a una coda di priorità esistente,...
Definition: minheap.c:34
minheap.h
HeapCreateEmpty
Heap * HeapCreateEmpty()
La funzione HeapCreateEmpty() crea e ritorna una coda di priorità vuota implementata mediante array.
Definition: minheap.c:27
HeapLeft
int HeapLeft(int i)
Dato l'indice di un nodo della coda di priorità, la funzione HeapLeft() ritorna l'indice del suo figl...
Definition: minheap.c:11
Heap::data
ElemType * data
Definition: minheap.h:21
HeapDelete
void HeapDelete(Heap *h)
La funzione HeapDelete() libera la memoria occupata dall'heap.
Definition: minheap.c:85
HeapIsEmpty
bool HeapIsEmpty(const Heap *h)
La funzione HeapIsEmpty() verifica se una coda di priorità esistente è vuota.
Definition: minheap.c:23
HeapMinMoveUp
void HeapMinMoveUp(Heap *h, int i)
Dato un heap e l'indice di un nodo, la funzione HeapMinMoveUp() sposta il nodo verso l'alto,...
Definition: minheap.c:53
HeapWrite
void HeapWrite(const Heap *h, FILE *f)
La funzione HeapWrite() stampa la coda di priorità su file. Nello specifico, la funzione stampa il ca...
Definition: minheap.c:97
HeapParent
int HeapParent(int i)
Dato l'indice di un nodo della coda di priorità, la funzione HeapParent() ritorna l'indice del nodo p...
Definition: minheap.c:19
Heap::size
size_t size
Definition: minheap.h:22
Heap
Definizione del tipo struct Heap.
Definition: minheap.h:20
HeapMinMoveDown
void HeapMinMoveDown(Heap *h, int i)
Dato un heap e l'indice di un nodo, la funzione HeapMinMoveDown() sposta il nodo verso il basso,...
Definition: minheap.c:60
HeapGetNodeValue
ElemType * HeapGetNodeValue(const Heap *h, int i)
La funzione HeapGetNodeValue() ritorna un puntatore all'elemento contenuto nel nodo di indice specifi...
Definition: minheap.c:43
HeapRight
int HeapRight(int i)
Dato l'indice di un nodo della coda di priorità, la funzione HeapRight() ritorna l'indice del suo fig...
Definition: minheap.c:15
HeapWriteStdout
void HeapWriteStdout(const Heap *i)
La funzione HeapWriteStdout() stampa lo heap specificato su stdout. Nello specifico,...
Definition: minheap.c:108