Oppure

Loading
03/05/14 16:09
bububs
Allora dovrei gestire una coda attraverso una lista concatenata circolare sotto forma di classe.
Io ho fatto in questo modo però non so se è giusto. (Come ho fatto non credo sia circolare)
class ele {
    private:
      int info;
      ele* punt;
    public:
      ele() {
         punt = NULL;
      }
      ele(int x, ele* e) {
         info = x;
         punt = e;
      }
      int get_info() {return info;}
      ele* get_punt() {return punt;}
      void set_info(int x) {info = x;}
      void set_punt(ele* s) {punt = s;}
};

class coda {
    private:
      ele* l;
    public:
      coda() {
           l = NULL;
      }

      void stampa() {
        ele* t = l;
        while (t != NULL) {
            cout<< t->get_info() << "  ";
            t = t->get_punt();
        }
      }

      bool isEmpty() {
           return (l == NULL);
      }

      void add_top(int x) {//inserisce in testa alla lista
           ele* t = new ele(x, l);
           l = t;
      }

      void add_bot(int x) {//inserisce in fondo alla lista
           if ( isEmpty() ) add_top(x);
           else {
                ele* t, * s;
                s = new ele;
                s->set_info(x);
                t = l;
                while (t->get_punt() != NULL)   t = t->get_punt();
                t->set_punt(s);
                s->set_punt(NULL);
           }
      }

};

int main()
{
    coda c;
    c.add_bot(1);
    c.add_bot(2);
    c.add_bot(3);
    c.stampa();
    return 0;
}
Ultima modifica effettuata da bububs 03/05/14 16:13
aaa
04/05/14 4:35
pierotofy
Una lista circolare e' semplicemente una lista dove l'ultimo elemento punta al primo.

en.wikipedia.org/wiki/…

Di conseguenza questo:

while (t->get_punt() != NULL)   t = t->get_punt();


Non puo' andare bene (ciclo infinito).

Dovresti tenere traccia del primo elemento e dell'ultimo, per poter identificare la fine della coda.

class coda {
    private:
      ele* primo;
      ele* ultimo;
Il mio blog: piero.dev
04/05/14 12:27
bububs
Grazie intanto della risposta. Ho provato in questa maniera ma mi segnala errore.. come mai?

class ele {
    private:
      int info;
      ele* punt;
    public:
      ele() {
         punt = NULL;
      }
      ele(int x, ele* e) {
         info = x;
         punt = e;
      }
      int get_info() {return info;}
      ele* get_punt() {return punt;}
      void set_info(int x) {info = x;}
      void set_punt(ele* s) {punt = s;}
};

class coda {
    private:
      ele* primo;
      ele* ultimo;
    public:
      coda() {
           primo = ultimo = NULL;
      }

      void stampa() {
        
      }

      bool isEmpty() {
           return (primo == NULL);
      }

      void add(int x) {
           ele* temp = new ele;
            temp.set_info(x);
            temp.set_punt(NULL);
            if ( isEmpty() ) primo=ultimo=temp;
            else {
              primo.set_next(temp);
              ultimo=temp;
            }
      }

};
 e 
int main()
{
    coda c;
    c.add(1);
    c.add(2);
    c.add(3);
    c.stampa();
    return 0;
}



p.s. l'errore è riferito ad ogni riferimento delle funzioni set della classe ele ed è il seguente, :
error: request for member 'set_next' in 'temp', which is of non-class type 'ele*' (righe 38, 39 e 42)
Ultima modifica effettuata da bububs 04/05/14 12:44
aaa
04/05/14 14:40
pierotofy
Devi dereferenziare il puntatore prima di accedere ai suoi metodi.

(*temp).set_info(x);


Oppure meglio, usando lo zucchero semantico:

temp->set_info(x);


Riguarda il capitolo sui puntatori per capire cosa sta succedendo qui.
Il mio blog: piero.dev
05/05/14 7:20
bububs
Perfetto grazie mille. Ho rivisto anche la parte che riguarda i puntatori e il significato del simbolo "->".
Ho provato a fare le funzioni di aggiunta in coda add() e stampa() però non mi stampa correttamente :_doubt: Dove sbaglio?

class ele {
    private:
        int info;
        ele* punt;
    public:
        ele() {
            punt = NULL;
        }
        ele(int x, ele* e) {
            info = x;
            punt = e;
        }
        int get_info() {return info;}
        ele* get_punt() {return punt;}
        void set_info(int x) {info = x;}
        void set_punt(ele* s) {punt = s;}
};

class coda {
    private:
        ele* primo;
        ele* ultimo;
    public:
        coda() {
            primo = ultimo = NULL;
        }

        void stampa() {
            ele* e = primo;
            do {
                cout<< e->get_info() << "  ";
                e = e->get_punt();
            }while (e->get_punt() != ultimo);
        }

        bool isEmpty() {
            return (primo == NULL);
        }

        void add(int x) {//inserisce in fondo alla lista
            ele* temp = new ele;
            temp->set_info(x);
            temp->set_punt(primo);
            if ( isEmpty() ) primo=ultimo=temp;
            else {
                primo->set_punt(temp);
                ultimo = temp;
            }
        }
};

int main()
{
    coda c;
    c.add(1);
    c.add(2);
    c.add(3);
    c.stampa();
    return 0;
}

aaa
05/05/14 22:55
pierotofy
In add:

temp->set_punt(ultimo);


Invece di:

temp->set_punt(primo);


Prendi un foglio di carta, fai un diagramma di cosa sta succedendo di passo in passo (crea la lista concatenata e tieni traccia dei puntatori) per capire perche'.

Dopodiche' la funzione di stampa dev'essere aggiustata:

void stampa() {
            ele* e = ultimo;
            while(e != primo){
                cout<< e->get_info() << "  ";
                e = e->get_punt();
            }
            if (e != NULL) cout<< e->get_info() << "  ";
}


L'if e' necessario per controllare il caso in cui la lista e' vuota.
Il mio blog: piero.dev
06/05/14 19:13
bububs
Ti ringrazio molto. Sono riuscito a capire come funziona il tutto :k:

P.S. Ho corretto anche la funzione remove perchè era sbagliata come l'avevo fatta io ;)
Ultima modifica effettuata da bububs 06/05/14 19:15
aaa