Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    213

    [C++] Funzione inserisci di un ABR

    In un progetto in cui sto implementando la codifica di Huffman, ho necessità di utilizzare come coda di priorità un ABR ma ho un problema nella creazione della funzione inserisci. Vi posto prima di tutto la class nodo che ho utilizzato:

    codice:
    class nodo {
        private:
                int frequenza;
                unsigned char valore;
                nodo *sinistro;
                nodo *destro;
        public:
                nodo() {};
                nodo(int f, unsigned char v) {frequenza = f; valore = v;};
                ~nodo() {};
                void setFrequenza(int f) {frequenza = f;};
                int getFrequenza() {return frequenza;};
                void setValore(unsigned char v) {valore = v;};
                int getValore() {return valore;};
                void setSinistro (nodo *s) {sinistro = s;};
                nodo getSinistro() {return *sinistro;};
                void setDestro (nodo *d) {destro = d;};
                nodo getDestro() {return *destro;};
    };
    Questa invece è l'implementazione della funzione:
    codice:
    void abr::insertABR(int d, unsigned char v)
    {
        nodo* t = new nodo;
        cout << "Nodo t = " << t;
        nodo* parent;
        t->setFrequenza(d);
        cout << "Set d di t a " << d;
        t->setValore(v);
        cout << "Set v di t a " << v;
        t->setSinistro(nullptr);
        t->setDestro(nullptr);
        parent = nullptr;
        cout << "Nodo parent = " << parent;
    
    
        if(isEmpty()) {
                root = t;
                cout << "Albero vuoto, root settata a t " << t;
        }
        else
        {
            nodo* curr;
            curr = root;
            cout << "Nodo curr = " << curr;
            while(curr)
            {
                parent = curr;
                if(t->getFrequenza() > curr->getFrequenza()) {
                    cout << "Scende a destra: " << t->getFrequenza() << " e' maggiore di " << curr->getFrequenza();
                   curr = curr->getDestro();
                    cout << curr;
                } else  {
                    cout << "Scende a sinistra: " << t->getFrequenza() << " e' minore di " << curr->getFrequenza();
                    curr = curr->getSinistro();
                    cout << curr;
                }
            }
    
    
            if(t->getFrequenza() < parent->getFrequenza()) {
               parent->setSinistro(t);
               cout << "t diventa figlio sinistro di " << parent << endl;
             } else {
               parent->setDestro(t);
               cout << "t diventa figlio destro di " << parent  << endl;
             }
        }
    Ho aggiunto un paio di cout per cercare l'errore ed ovviamente è la riga:
    codice:
    ù
    curr = curr->getDestro();
    curr = curr->getSinistro();
    riportandomi l'errore cannot convert nodo to *nodo in assignment. Se le cambio in *curr mi parte ma mi va in crash quando raggiunge quella parte di codice.

    Come potrei risolvere?

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    codice:
    // sbagliata! nodo getSinistro() {return *sinistro;};
    
    nodo* getSinistro() {return sinistro;}; // corretta.
    Hint: puoi modificare il costruttore di default di nodo in modo che azzeri i due puntatori in fase di creazione
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2012
    Messaggi
    213
    Quote Originariamente inviata da shodan Visualizza il messaggio
    codice:
    // sbagliata! nodo getSinistro() {return *sinistro;};
    
    nodo* getSinistro() {return sinistro;}; // corretta.
    Hint: puoi modificare il costruttore di default di nodo in modo che azzeri i due puntatori in fase di creazione
    Hai ragione! Ora funziona finalmente questa maledetta funzione.
    Si grazie per il consiglio, lo avevo già pensato ma al momento avevo necessità di risolvere questo guaio.

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.