Ragazzi ho un dubbio atroce, spero qualcuno mi sappia dare una risposta esaustiva. Allora ho realizzato un programma che gestisce la coda a priorità e cioè un heap implementandolo con un array. Come guarderete stesso voi nella libreria heap ho realizzato le funzioni costruisci_heap e heapify dichiarandole di tipo void. Adesso il mio dubbio è proprio su questo, dato che heapify innanzitutto è ricorsiva come funzione e inoltre modifica il vettore puntato dal campo first presente nella struttura heap, è corretto fare in questo modo ? O il ritorno di queste due funzioni deve essere un puntatore alla struttura heap ? e cioè sosituire void heapify(----) con heap *heapify(----) ???

Come codice vi posto solo parte interessata al mio dubbio. Credo che basti per farvi capire.


main.c
codice:
int main(){
	srand(time(NULL));
	elem *vet,*m,*val;
	heap *A;
	int n,i,tipo,scelta,pos;
	void *inf;
	funzioni *funz;
	
	 A=(heap *)malloc(sizeof(heap));
	 A->size=0;
	
	printf("\n SCEGLIERE IL TIPO DI ALBERO SU CUI VOLER OPERARE ");
    printf("\n\n (1)  Interi");
    printf("\n (2)  Float");
    printf("\n (3)  Stringhe");
    printf("\n (4)  Persone\n");
    printf("\n Tasto digitato :  ");
    scanf("%d", &tipo);
    getchar();
    
    switch(tipo){
    	case 1 : {
    		funz=Init_funzioni_interi();
    		break;
    	}
    	case 2 : {
    		funz=Init_funzioni_float();
    		break;
    	}
    	case 3 : {
    		funz=Init_funzioni_char();
    		break;
    	}
    	case 4 : {
    		funz=Init_funzioni_pers();
    		break;
    	}
    }
	system("cls");
	printf("\n\n COME REALIZZARE L'HEAP ");
	printf("\n (1) Inserisci un vettore di valori ");
	printf("\n (2) Inserisci un solo elemento ");
	printf("\n\n Tasto digitato :  ");
	scanf("%d",&scelta);
	getchar();
	
	switch(scelta){
		case 1 :{
		    insert_vet(A,funz);
		    break;
		}
		case 2 : {
			val=(elem *)malloc(sizeof(elem));
	   	   	val->prior=random(0,30);
	   	   	val->dato=funz->input();
		    A->buf=1;
		    A->first=(elem *)malloc(sizeof(elem));
		    (A->first)->dato=val->dato;
		    (A->first)->prior=val->prior;
		    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 (0) Esci dall'esecuzione del programma ");
	   printf("\n\n Tasto digitato :  ");
	   scanf("%d",&scelta);
	   getchar();
	
	   switch(scelta){
	   	   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=funz->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;
	   	   }
		   case 2 : {
			   m=max(A);
			   printf("\n\n Elemento massimo :  ");
			   printf(" Dato=  ");
	           funz->output(m->dato);
	           printf(" Priorita'=  ");
	           printf("%d",m->prior);
			   break;
		   }
		   case 3 : {
			   m=estrai_max(A);
			   printf("\n\n Elemento estratto :  ");
			   printf(" Dato=  ");
	           funz->output(m->dato);
	           printf(" Priorita'=  ");
	           printf("%d",m->prior);
			   break;
		   }
		   case 4 : {
			   for(i=0;i<(A->size);i++){
		            printf("\n\n A[%d]  Priorita':  %d ",i,(A->first+i)->prior);
	     	        printf("  Dato: ");
		            funz->output((A->first+i)->dato);
	           }
			   break;
		   }
		   case 5 : {
		   	   printf("\n\n Inserisci elemento da cancellare \n");
		   	   printf("\n Dato :  ");
               inf=funz->input();
		   	   getchar();
		   	   do{
		   	        pos=search(A,inf,funz);
		   	        if(pos==-1)
		   	            printf("\n\n L'elemento da te richiesto non esiste nella coda ");
		   	        else
		   	            del_heap(A,pos);
		       }while(pos!=-1);
		   	   break;
		   }
	   }
	printf("\n\n");
	system("PAUSE");
   }while(scelta!=0);
			
	free(A);
	return 0;
}

Heap.c
codice:
#include<stdio.h>
#include<stdlib.h>
#include"heap.h"

int left(int i){
	    if(i==0)
	        return 1;
	    else
	        return (2*i)+1; 
}


int right(int i){
	    if(i==0)
	        return 2;
	    else
	        return (2*i)+2;
}


int padre(int i){
	if(i==0)
	     return 0;
	else if((i%2)==0)
			return (i/2)-1;
		else	
			return (i/2);
}

void heapify(heap *A, int i){
	
	int l,r,max;
	l=left(i);
	r=right(i);
	if((l<(A->size)) && ((A->first+l)->prior>(A->first+i)->prior))
		max=l;
	else
	    max=i;
	if((r<(A->size)) && ((A->first+r)->prior>(A->first+max)->prior))
	   max=r;
	if(max!=i){
		swap(A->first+max,A->first+i);
		heapify(A,max);
	}
return;   
}

elem *max(heap *A){
	if((A->size)<1){
		printf("\n\n Error : Non ci sono elementi nell'array \n\n");
		return NULL;
	}
	else
	    return A->first;
}


elem *estrai_max(heap *A){
	elem *max=NULL;
	max=(elem *)malloc(sizeof(elem));
	if((A->size)<1)
		printf("\n\n Error : Non ci sono elementi nell'array \n\n");	
	max->dato=(A->first)->dato;
	max->prior=(A->first)->prior;
	(A->first)->dato=(A->first+(A->size-1))->dato;
	(A->first)->prior=(A->first+(A->size-1))->prior;
	A->size--;
	heapify(A,0);
return max;
}

void costruisci_heap(heap *A){
	int i,n;
	n=A->size;
	for(i=((n-1)/2);i>=0;i--)
	     heapify(A,i);
return;
}


int search(heap *A, void *val,funzioni *funz){
	int i,pos=0;
	i=(A->size)-1;
	while((funz->confronto((A->first+i)->dato,val)!=0) && (i>=0))
	       i--;
	if(i>-1)
	     pos=i;
	else
	     pos=-1;	
return pos;	
}


void del_heap(heap *A,int i){
	 //(A->first+i)->dato=(A->first+(A->size-1))->dato;
	 //(A->first+i)->prior=(A->first+(A->size-1))->prior;
     if(((A->first+(A->size-1))->prior)>((A->first+i)->prior))
              increase_key(A,i,(A->first+(A->size-1)));
          else
              decrease_key(A,i,(A->first+(A->size-1)));
     A->size--;
return;
}


void increase_key(heap *A, int i,elem *val){
	if(val->prior<((A->first+i)->prior))
	     printf("\n\n ERROR : Nuova chiave piu' piccola ");
	else{
		 (A->first+i)->dato=val->dato;
		 (A->first+i)->prior=val->prior;
		 while((i>0) && ((A->first+padre(i))->prior<((A->first+i)->prior))){
		 	 	swap(A->first+1,A->first+padre(i));
		        i=padre(i);
		 }	    
	}
return;
}


void decrease_key(heap *A,int i,elem *val){
	if(val->prior>((A->first+i)->prior))
	     printf("\n\n ERROR : Nuova chiave piu' grande ");
	else{
		 (A->first+i)->dato=val->dato;
		 (A->first+i)->prior=val->prior;
		 heapify(A,i);
	}
return;
}


void insert_vet(heap *A,funzioni *funz){
	    elem *vet;
	    int n,i;
	    void *inf;
		
		printf("\n\n Digita il numero di elementi che vuoi inserire :  ");
	        scanf("%d",&n);
	        getchar();
	        vet=(elem *)malloc(n*sizeof(elem));
		    for(i=0;i<n;i++){
		        (vet+i)->prior=random(0,30);
		        printf("\n\n Inserisci Dato %d :  ",i);
		        inf=funz->input();
		        (vet+i)->dato=inf;
	        }
	    
	     A->first=vet;
	     A->size=n;
	     A->buf=n;
	     costruisci_heap(A);
return;
}


void insert_key(heap *A,elem *val){
	A->size++;
	(A->first+(A->size-1))->prior=-32700;
	increase_key(A,(A->size-1),val);
	return;
}


void swap(elem *a, elem *b){
	elem *app=(elem *)malloc(sizeof(elem));
	app->prior=a->prior;
	app->dato=a->dato;
	a->prior=b->prior;
	a->dato=b->dato;
	b->prior=app->prior;
	b->dato=app->dato;
	free(app);
return;
}