Desktop/Daniele/Program Editing/Progetto di informatica 2/componenti/heap.cpp

00001 
00002 #include "heap.h"
00003 
00004 void scambia (frequenza** v, int i, int j) 
00005 //scambia i puntatori nell'heap
00006 {
00007 frequenza* app = v[i];
00008 v[i] = v[j];
00009 v[j] = app;
00010 }
00011 
00012 heap::heap(frequenza** pf, int n) //costruttore
00013 {
00014 v = pf;
00015 last = n-1;
00016 buildheap(); //invoca la buildheap perché all'inizio l'array è non è un heap
00017 }
00018 
00019 void heap::down(int i) 
00020                        //funzione down che serve nell'estrazione, mantiene 
00021                        //le proprietà dell'heap
00022 {
00023 int son = 2*i+1;
00024 if (son == last)
00025    if (v[son]->freq < v[i]->freq) scambia (v,i,son);
00026 if (son < last)
00027    {
00028    if (v[son]->freq > v[son+1]->freq) son++;
00029    if (v[son]->freq < v[i]->freq)
00030       {
00031       scambia (v,i,son);
00032       down (son);
00033       }
00034    }
00035 }
00036 
00037 frequenza* heap::estrai() //estrae il primo nodo (a frequenza più bassa)
00038 {
00039 frequenza* app = v[0];
00040 v[0] = v[last--];
00041 down (0);
00042 return app;
00043 }
00044 
00045 int heap::lastn()
00046 {
00047 return last;
00048 }
00049       
00050 void heap::inserisci (frequenza* f) //inserisce il nodo con l'aiuto di up
00051 {
00052 v[++last] = f;
00053 up(last);
00054 }
00055        
00056 void heap::up (int i) 
00057                       //fa scorrere il nodo verso l'alto conservando le
00058                       //proprierà dell heap
00059 {
00060 if (i <= 0) return;
00061 if (v[(i-1)/2]->freq > v[i]->freq) 
00062    {
00063    scambia (v,i,(i-1)/2);
00064    up ((i-1)/2);
00065    }
00066 }
00067 
00068 void heap::buildheap() //costruisce lo heap a partire da un array qualsiasi
00069 {
00070 for (int i = last/2; i >= 0; i--)
00071     down (i);
00072 }

Generated on Sat May 20 14:57:56 2006 for Huffzip by  doxygen 1.4.6-NO