Ragazzi ho problemi con la deallocazione di una coda a priorità, vi posto il Main (dove ci sono i puntini si trova semplicemente l'inizializzazione delle callback) e vi posto le funzioni interessate.

Main :
codice:
int main(int argc, char *argv[]){
	srand(time(NULL));
	elem *vet,*m,*val;
	Heap_A *A;
	int n,i,choice,pos,prior;
	void *inf;
	function *f;
	
	A=Heap_Arr_Create(A);
        .
        .
        .
       
		    A->buf=1;
		    A->first=(elem *)malloc(sizeof(elem));
		    printf("\n Inserisci il dato :  ");
		    (A->first)->dato=f->Input();
		    (A->first)->prior=random(0,30);
		    A->size++;
			break;
		}
	}
	do {
	   system("cls");
	   printf("\n\n Scegliere il tipo di operazione da effettuare ");
	   printf("\n (1) Inserire un nuovo elemento ");
	   printf("\n (2) Stampa il valore massimo della coda a priorita' ");
	   printf("\n (3) Estrai il valore massimo della coda a priorita' ");
	   printf("\n (4) Stampa il contenuto della coda a priorita' ");
	   printf("\n (5) Cancella un elemento dalla coda a priorita' ");
	   printf("\n (6) Incrementa la priorita' di un dato ");
	   printf("\n (7) Decrementa la priorita' di un dato ");
	   printf("\n (0) Esci dall'esecuzione del programma ");
	   printf("\n\n Tasto digitato :  ");
	   scanf("%d",&choice);
	   getchar();
	
	   switch(choice){
	   	   case 1 : {
	   	   	   val=(elem *)malloc(sizeof(elem));
	   	   	   printf("\n\n Inserisci elemento da inserire \n");
	   	   	   printf("\n Priorita' :  ");
	   	   	   scanf("%d",&(val->prior));
	   	   	   getchar();
	   	   	   printf(" Dato :  ");
	   	   	   val->dato=f->Input();
		       /*if((A->size)>=(A->buf)){
		                A->buf=(A->buf)*2;
		                A->first=(elem *)realloc(A->first,A->buf*sizeof(elem));
		       }*/
		       Insert_key(A,val);
	   	   	   break;
	   	   }
Funzione INSERT_KEY:

codice:
void Insert_key(Heap_A *A,elem *val){
	A->size++;
	if((A->size)>=(A->buf)){
		    A->buf=(A->buf)*2;
		    A->first=(elem *)realloc(A->first,A->buf*sizeof(elem));
	}
	(A->first+(A->size-1))->prior=INT_MIN;
	(A->first+(A->size-1))->dato=val->dato;
	Increase_key(A,(A->size-1),val->prior);
	free(val);
}
Quest'ultima è la funzione chiamata alla fine del main il cui scopo sarebbe quello di deallocare la struttura realizzata:

Funzione CHE DEALLOCA:
codice:
void Free_Arr(Heap_A *A){
	int i=(A->size)-1;
	while(i>=0){
		free((A->first)+i);
		i--;
	}
}
E' chiamata alla fine del main in questo modo : Free_Arr(A);

Ecco le due strutture utilizzate :
codice:
struct elemento{
	int prior;
	void *dato;
};
typedef struct elemento elem;


struct infor{
	int size;                                 //Grandezza dello heap
	int buf;                                  //Dimensione del buffer
	struct elemento *first;
};
typedef struct infor Heap_A;