bububs (Normal User)
Expert
Messaggi: 253
Iscritto: 11/03/2010
|
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++ |
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 il 03/05/2014 alle 18:13 |
|
pierotofy (Admin)
Guru^2
Messaggi: 6230
Iscritto: 04/12/2003
|
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++ |
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++ |
class coda {
private:
ele* primo;
ele* ultimo;
|
|
|
bububs (Normal User)
Expert
Messaggi: 253
Iscritto: 11/03/2010
|
Grazie intanto della risposta. Ho provato in questa maniera ma mi segnala errore.. come mai?
Codice sorgente - presumibilmente C++ |
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 il 04/05/2014 alle 14:44 |
|
pierotofy (Admin)
Guru^2
Messaggi: 6230
Iscritto: 04/12/2003
|
Devi dereferenziare il puntatore prima di accedere ai suoi metodi.
Codice sorgente - presumibilmente Plain Text |
Oppure meglio, usando lo zucchero semantico:
Codice sorgente - presumibilmente Plain Text |
Riguarda il capitolo sui puntatori per capire cosa sta succedendo qui.
|
|
bububs (Normal User)
Expert
Messaggi: 253
Iscritto: 11/03/2010
|
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 Dove sbaglio?
Codice sorgente - presumibilmente C/C++ |
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;
}
|
|
|
pierotofy (Admin)
Guru^2
Messaggi: 6230
Iscritto: 04/12/2003
|
In add:
Codice sorgente - presumibilmente Plain Text |
Invece di:
Codice sorgente - presumibilmente Plain Text |
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++ |
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.
|
|
bububs (Normal User)
Expert
Messaggi: 253
Iscritto: 11/03/2010
|
Ti ringrazio molto. Sono riuscito a capire come funziona il tutto
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 |
|