Visualizzazione dei risultati da 1 a 4 su 4

Discussione: Puntatori e funzioni

  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2013
    residenza
    Bologna
    Messaggi
    31

    Puntatori e funzioni

    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:

    codice:
    typedef struct{
        int N;
        int Info[MAX];
    }Heap;
    e, nel mio main, voglio richiamare la funzione ExtractMax:

    codice:
    //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);
    }

    codice:
    /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);
        }
    }
    codice:
    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.
    Ultima modifica di gmac; 16-06-2016 a 22:06

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,467
    È 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.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2013
    residenza
    Bologna
    Messaggi
    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:
    codice:
    //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);
    }
    codice:
    //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);
        }
    
    
    }
    codice:
    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:

    codice:
    //FUNZIONE SWAP
    void Swap(int *a, int *b){
        int temp;
        temp = *b;
        *b = *a;
        *a = temp;
    }
    in particolare nell'istruzione: *b = *a;

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,467
    In che senso "si blocca" ?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,467
    Se hai un errore, dicci cosa succede esattamente ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,467
    Quote Originariamente inviata da gmac Visualizza il messaggio
    in particolare nell'istruzione: *b = *a;
    Ovvero? In dettaglio ? Quale errore?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.