PDA

Visualizza la versione completa : Puntatori e funzioni


gmac
16-06-2016, 21:58
Ciao a tutti ragazzi, sto avendo un po' di difficoltà con l'utilizzo dei puntatori.
In particolare, non riesco a capire bene come fare il passaggio dei dati; mi spiego meglio:

Ho un ADT così definito:


typedef struct{
int N;
int Info[MAX];
}Heap;


e, nel mio main, voglio richiamare la funzione ExtractMax:


//ESTRAZIONE DEL MASSIMO IN UNA CODA A PRIORITA'
void extractMax(Heap *H){
int max;
if(codaVuota(*H)){
printf("CODA VUOTA\n");
}
//ESTRAGGO IL MASSIMO, SAPPIAMO CHE IN UN MAXHEAP E' SEMPRE IL PRIMO ELEMENTO
//N.B. NOI RAPPRESENTIAMO L'ALBERO PARTENDO DA 0 E NON DA 1
max = H->Info[0];
H->Info[0] = H->Info[H->N];
//DECREMENTO IL VETTORE
H->N--;
//APPLICO LA HEAPIFY SUL PRIMO ELEMENTO, SAPENDO CHE SI RIPERCUOTE SU TUTTI I SOTTOALBERI
Heapify(H, 0);
}




/APPLICA LO HEAPIFY ALL'ALBERO BINARIO
void Heapify(Heap *H, int i){
int l, r, m, comodo = 0, largest;
l = Left(i);
r = Right(i);
if(H->Info[i] > comodo){
largest = i;
comodo = H->Info[i];
}
if(H->Info[l] > comodo){
largest = l;
comodo = H->Info[l];
}
if(H->Info[r] > comodo){
largest = r;
comodo = H->Info[r];
}
//SE IL VALORE DA SCAMBIARE NON E' IL NODO STESSO, SCAMBIO I VALORI
if(largest != i){
Swap(&H->Info[i], &H->Info[largest]);
Heapify(H, largest);
}
}



int main(){

//DICHIARO LO HEAP
Heap H;
//INIZIALIZZA Heap
inizializzaHeap(&H);
//ESTRAGGO IL VALORE CON MASSIMA PRIORITA'
extractMax(&H);
//STAMPO ALBERO BINARIO - HEAP
stampaHeap(H);


return 0;
}


Ora, ovviamente, quando devo passare un array ad una funzione, devo farlo per parametro, quindi gli passo l'indirizzo di memoria &H e la funzione dichiara il suo bel puntatore void extractMax(Heap *H){ --CODICE--} però, quello che non capisco è, al suo interno, quando richiama la funzione Heapify, come dovrebbe fare la chiamata? Per parametro? Dovrei fare un Heapify(*H, i)????? Mi sto perdendo....
Qualche consiglio o materiale specifico?


Grazie mille a tutti.

oregon
16-06-2016, 22:20
È corretto come hai scritto nel codice . Il puntatore è H. Le difficoltà stanno nel fatto che hai chiamato H sia la variabile sia l'argomento puntatore. Prova ad usare

Heap *pH

come nome di argomento delle funzioni. Quindi userai

Heapify(pH, 0);

intendendo che passi il puntatore ricevuto.

gmac
16-06-2016, 22:31
Ciao Oregon, grazie mille per avermi risposto ancora una volta e, ancora una volta, con una certa celerità :)

Ho provato a seguire il tuo consiglio:

//ESTRAZIONE DEL MASSIMO IN UNA CODA A PRIORITA'
void extractMax(Heap *PH){
int max;
if(codaVuota(*PH)){
printf("CODA VUOTA\n");
}
//ESTRAGGO IL MASSIMO, SAPPIAMO CHE IN UN MAXHEAP E' SEMPRE IL PRIMO ELEMENTO
//N.B. NOI RAPPRESENTIAMO L'ALBERO PARTENDO DA 0 E NON DA 1
max = PH->Info[0];
PH->Info[0] = PH->Info[PH->N];
//DECREMENTO IL VETTORE
PH->N--;
//APPLICO LA HEAPIFY SUL PRIMO ELEMENTO, SAPENDO CHE SI RIPERCUOTE SU TUTTI I SOTTOALBERI
Heapify(PH, 0);
}




//APPLICA LO HEAPIFY ALL'ALBERO BINARIo
void Heapify(Heap *PPH, int i){
int l, r, m, comodo = 0, largest;
l = Left(i);
r = Right(i);
if(PPH->Info[i] > comodo){
largest = i;
comodo = PPH->Info[i];
}
if(PPH->Info[l] > comodo){
largest = l;
comodo = PPH->Info[l];
}
if(PPH->Info[r] > comodo){
largest = r;
comodo = PPH->Info[r];
}
//SE IL VALORE DA SCAMBIARE NON E' IL NODO STESSO, SCAMBIO I VALORI
if(largest != i){
Swap(&PPH->Info[i], &PPH->Info[largest]);
Heapify(PPH, largest);
}


}



int main(){
--CODE--

ExtractMax(&H);
return 0;
}

Ho provato, inoltre, a lanciare un debug, e vedo che si blocca nel momento in cui esegue lo swap nella funzione Heapify:


//FUNZIONE SWAP
void Swap(int *a, int *b){
int temp;
temp = *b;
*b = *a;
*a = temp;
}

in particolare nell'istruzione: *b = *a;

oregon
16-06-2016, 23:49
In che senso "si blocca" ?

oregon
17-06-2016, 00:01
Se hai un errore, dicci cosa succede esattamente ...

oregon
17-06-2016, 11:19
in particolare nell'istruzione: *b = *a;

Ovvero? In dettaglio ? Quale errore?

Loading