Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Lista Concatenata Circolare (tramite class)
Forum - C/C++ - Lista Concatenata Circolare (tramite class)

Avatar
bububs (Normal User)
Expert


Messaggi: 253
Iscritto: 11/03/2010

Segnala al moderatore
Postato alle 18:09
Sabato, 03/05/2014
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)
Codice sorgente - presumibilmente C++

  1. class ele {
  2.     private:
  3.       int info;
  4.       ele* punt;
  5.     public:
  6.       ele() {
  7.          punt = NULL;
  8.       }
  9.       ele(int x, ele* e) {
  10.          info = x;
  11.          punt = e;
  12.       }
  13.       int get_info() {return info;}
  14.       ele* get_punt() {return punt;}
  15.       void set_info(int x) {info = x;}
  16.       void set_punt(ele* s) {punt = s;}
  17. };
  18.  
  19. class coda {
  20.     private:
  21.       ele* l;
  22.     public:
  23.       coda() {
  24.            l = NULL;
  25.       }
  26.  
  27.       void stampa() {
  28.         ele* t = l;
  29.         while (t != NULL) {
  30.             cout<< t->get_info() << "  ";
  31.             t = t->get_punt();
  32.         }
  33.       }
  34.  
  35.       bool isEmpty() {
  36.            return (l == NULL);
  37.       }
  38.  
  39.       void add_top(int x) {//inserisce in testa alla lista
  40.            ele* t = new ele(x, l);
  41.            l = t;
  42.       }
  43.  
  44.       void add_bot(int x) {//inserisce in fondo alla lista
  45.            if ( isEmpty() ) add_top(x);
  46.            else {
  47.                 ele* t, * s;
  48.                 s = new ele;
  49.                 s->set_info(x);
  50.                 t = l;
  51.                 while (t->get_punt() != NULL)   t = t->get_punt();
  52.                 t->set_punt(s);
  53.                 s->set_punt(NULL);
  54.            }
  55.       }
  56.  
  57. };
  58.  
  59. int main()
  60. {
  61.     coda c;
  62.     c.add_bot(1);
  63.     c.add_bot(2);
  64.     c.add_bot(3);
  65.     c.stampa();
  66.     return 0;
  67. }


Ultima modifica effettuata da bububs il 03/05/2014 alle 18:13
PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 6:35
Domenica, 04/05/2014
Una lista circolare e' semplicemente una lista dove l'ultimo elemento punta al primo.

http://en.wikipedia.org/wiki/Linked_list#Circular_list

Di conseguenza questo:

Codice sorgente - presumibilmente C/C++

  1. 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.

Codice sorgente - presumibilmente C/C++

  1. class coda {
  2.     private:
  3.       ele* primo;
  4.       ele* ultimo;



Il mio blog: https://piero.dev
PM Quote
Avatar
bububs (Normal User)
Expert


Messaggi: 253
Iscritto: 11/03/2010

Segnala al moderatore
Postato alle 14:27
Domenica, 04/05/2014
Grazie intanto della risposta. Ho provato in questa maniera ma mi segnala errore.. come mai?

Codice sorgente - presumibilmente C++

  1. class ele {
  2.     private:
  3.       int info;
  4.       ele* punt;
  5.     public:
  6.       ele() {
  7.          punt = NULL;
  8.       }
  9.       ele(int x, ele* e) {
  10.          info = x;
  11.          punt = e;
  12.       }
  13.       int get_info() {return info;}
  14.       ele* get_punt() {return punt;}
  15.       void set_info(int x) {info = x;}
  16.       void set_punt(ele* s) {punt = s;}
  17. };
  18.  
  19. class coda {
  20.     private:
  21.       ele* primo;
  22.       ele* ultimo;
  23.     public:
  24.       coda() {
  25.            primo = ultimo = NULL;
  26.       }
  27.  
  28.       void stampa() {
  29.        
  30.       }
  31.  
  32.       bool isEmpty() {
  33.            return (primo == NULL);
  34.       }
  35.  
  36.       void add(int x) {
  37.            ele* temp = new ele;
  38.             temp.set_info(x);
  39.             temp.set_punt(NULL);
  40.             if ( isEmpty() ) primo=ultimo=temp;
  41.             else {
  42.               primo.set_next(temp);
  43.               ultimo=temp;
  44.             }
  45.       }
  46.  
  47. };
  48.  e
  49. int main()
  50. {
  51.     coda c;
  52.     c.add(1);
  53.     c.add(2);
  54.     c.add(3);
  55.     c.stampa();
  56.     return 0;
  57. }



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 il 04/05/2014 alle 14:44
PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 16:40
Domenica, 04/05/2014
Devi dereferenziare il puntatore prima di accedere ai suoi metodi.

Codice sorgente - presumibilmente Plain Text

  1. (*temp).set_info(x);



Oppure meglio, usando lo zucchero semantico:

Codice sorgente - presumibilmente Plain Text

  1. temp->set_info(x);



Riguarda il capitolo sui puntatori per capire cosa sta succedendo qui.


Il mio blog: https://piero.dev
PM Quote
Avatar
bububs (Normal User)
Expert


Messaggi: 253
Iscritto: 11/03/2010

Segnala al moderatore
Postato alle 9:20
Lunedì, 05/05/2014
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?
Codice sorgente - presumibilmente C/C++

  1. class ele {
  2.     private:
  3.         int info;
  4.         ele* punt;
  5.     public:
  6.         ele() {
  7.             punt = NULL;
  8.         }
  9.         ele(int x, ele* e) {
  10.             info = x;
  11.             punt = e;
  12.         }
  13.         int get_info() {return info;}
  14.         ele* get_punt() {return punt;}
  15.         void set_info(int x) {info = x;}
  16.         void set_punt(ele* s) {punt = s;}
  17. };
  18.  
  19. class coda {
  20.     private:
  21.         ele* primo;
  22.         ele* ultimo;
  23.     public:
  24.         coda() {
  25.             primo = ultimo = NULL;
  26.         }
  27.  
  28.         void stampa() {
  29.             ele* e = primo;
  30.             do {
  31.                 cout<< e->get_info() << "  ";
  32.                 e = e->get_punt();
  33.             }while (e->get_punt() != ultimo);
  34.         }
  35.  
  36.         bool isEmpty() {
  37.             return (primo == NULL);
  38.         }
  39.  
  40.         void add(int x) {//inserisce in fondo alla lista
  41.             ele* temp = new ele;
  42.             temp->set_info(x);
  43.             temp->set_punt(primo);
  44.             if ( isEmpty() ) primo=ultimo=temp;
  45.             else {
  46.                 primo->set_punt(temp);
  47.                 ultimo = temp;
  48.             }
  49.         }
  50. };
  51.  
  52. int main()
  53. {
  54.     coda c;
  55.     c.add(1);
  56.     c.add(2);
  57.     c.add(3);
  58.     c.stampa();
  59.     return 0;
  60. }


PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 0:55
Martedì, 06/05/2014
In add:

Codice sorgente - presumibilmente Plain Text

  1. temp->set_punt(ultimo);



Invece di:

Codice sorgente - presumibilmente Plain Text

  1. 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:

Codice sorgente - presumibilmente C/C++

  1. void stampa() {
  2.             ele* e = ultimo;
  3.             while(e != primo){
  4.                 cout<< e->get_info() << "  ";
  5.                 e = e->get_punt();
  6.             }
  7.             if (e != NULL) cout<< e->get_info() << "  ";
  8. }



L'if e' necessario per controllare il caso in cui la lista e' vuota.


Il mio blog: https://piero.dev
PM Quote
Avatar
bububs (Normal User)
Expert


Messaggi: 253
Iscritto: 11/03/2010

Segnala al moderatore
Postato alle 21:13
Martedì, 06/05/2014
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 il 06/05/2014 alle 21:15
PM Quote