-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathL_Heap.c
117 lines (100 loc) · 2.94 KB
/
L_Heap.c
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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#include <stdio.h>
#include <stdlib.h>
#include "L_Heap.h"
#include "L_Utility.h"
/* Funzione per il ripristino della proprieta' heap */
void F_heapify(StructHeap Heap, int i)
{
/* Callback chiamate:
* sinista/destra: richiama le funzioni F_HeapSx/F_HeapDx. Utilizzate per entrambe le strutture array/albero.
* Si e' preferito introdurle come callback nel caso in cui si voglia aggiungere una nuova struttura senza alterare
* la funzione F_heapify.
* FirstCheck: richiama le funzioni: F_FirstCheck_Albero||array_MaxMin
* SecondCheck: richiama le funzioni: F_SecondCheck_Albero||array_MaxMin
* Scambio: richiama le sunzioni: F_Scambio_Albero||array
* */
int l = Heap->sinistra(i);
int r = Heap->destra(i);
int mas = Heap->FirstCheck(Heap,l,i);
mas = Heap->SecondCheck(Heap,r,mas);
if(mas!=i)
{
Heap->Scambio(Heap,i,mas);
F_heapify(Heap,mas);
}
}
/* Indice elemento sinistro */
int F_HeapSx(int i)
{
i=(2*i)+1;
return i;
}
/* Indice elemento destro */
int F_HeapDx(int i)
{
i=(2*i)+2;
return i;
}
/* Allocazione della struttura per la gestione di array/alberi heap */
StructHeap F_alloca_heap(StructHeap Heap)
{
Heap = (struct struttura_gestione_heap *)malloc(sizeof(struct struttura_gestione_heap));
return Heap;
}
/* Funzione per la creazione del tipo di struttura specificata dall'utente */
StructHeap F_crea_heap(StructHeap Heap)
{
Heap=Heap->tipo_struttura(Heap); // Richiama: F_crea_albero||array
return Heap;
}
/* Funzione per l'estrazione ed eliminazione del primo elemento */
StructHeap F_estrai_minmax(StructHeap Heap)
{
if(Heap->struttura!=NULL)
{
Heap->struttura = Heap->EstraiMinMax(Heap); // Richiama: F_estrai_minmax_albero||array
}
else
puts("Struttura non presente!\n");
return Heap;
}
/* Funzione per il decremento della priorita' di un elemento scelto */
void F_decrease_key(StructHeap Heap)
{
if(Heap->struttura!=NULL)
{
Heap->DecreaseKey(Heap); // Richiama: F_decrease_key_albero||array
}
else
puts("Struttura non presente!\n");
}
/* Funzione per l'incremento della priorita' di un elemento scelto */
void F_increase_key(StructHeap Heap)
{
if(Heap->struttura!=NULL)
{
Heap->IncreaseKey(Heap); // Richiama: F_increase_key_albero||array
}
else
puts("Struttura non presente!\n");
}
/* Funzione per l'inserimento di un elemento dato dall'utente */
void F_inserisci_elemento(StructHeap Heap)
{
if(Heap->struttura!=NULL)
{
Heap->InserisciElem(Heap); // Richiama: F_inserisci_elemento_albero||array
}
else
puts("Struttura non presente!\n");
}
/* Funzione per la cancellazione di un elemento scelto dall'utente */
void F_cancella_elemento(StructHeap Heap)
{
if(Heap->struttura!=NULL)
{
Heap->CancellaElem(Heap); // Richiama: F_cancella_elemento_albero||array
}
else
puts("Struttura non presente!\n");
}