|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Dec 2005
Città: Toscana
Messaggi: 1196
|
[c++] Pila con liste
Nel programma di seguito descritto non riesco a vedere in stampa quello che ho inserito nella lista. Qualcuno sa aiutarmi e dirmi dov'è l'errore.
![]() #include <iostream> #include <cstdlib> #include <conio.h> using namespace std; struct elem { int info; elem *pun; }; class pila { private: elem *testa; public: pila() {testa = NULL;} bool empty(pila& pp); int dim(pila pp); void push(int val, pila& pp); void pop(); void stampa(); }; bool pila::empty(pila& pp) { if(pp.testa == NULL) return false; } int pila::dim(pila pp) { elem *punta = 0; int i = 0; while(punta != NULL) { punta = pp.testa->pun; i++; } return i; } void pila: ![]() { pila p; pila q; for(q.testa = pp.testa; q.testa!=NULL; q.testa = testa->pun) p.testa = q.testa; q.testa = new elem; testa->info = val; q.testa = NULL; if(pp.testa == NULL) pp.testa = q.testa; else p.testa = q.testa; } void pila::stampa() { pila a; while(testa != NULL) { cout << testa->info; a.testa = testa->pun; } } int main() { pila numeri; elem valori; int num; if(numeri.empty(numeri) == false) cout << "Pila Vuota." << endl; cout << numeri.dim(numeri) << endl << endl; cout << "Inserisci un numero nella pila: "; cin >> num; cout << numeri.dim(numeri) << endl << endl; numeri.stampa(); getch(); return 0; } |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Due cose al volo che ho notato
1 - Hai scritto la definizione di empty al contrario (la pila e' vuota quando il puntatore e' null). 2 - Perche' passi l'oggetto come argomento in dim, push e empty ? La signature dei metodi dovrebbe essere piu' o meno la seguente: Codice:
bool empty(); int dim(); void push(int val); 4 - Per la push potresti usare una soluzione molto piu' semplice, basta aggiungere elementi davanti la testa. qualcosa come il seguente: Codice:
void pila::push( int val ) { nuova_testa = new elem; nuova_testa->info = val; nuova_testa->pun = testa; testa = nuova_testa; }
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Dec 2005
Città: Toscana
Messaggi: 1196
|
Ho riscritto il codice in questo modo ma non riesco lo stesso a visualizzare l'output a video.
#include <iostream> #include <cstdlib> #include <conio.h> using namespace std; struct elem { int info; elem *pun; }; class pila { private: elem *testa; public: pila() {testa = NULL;} bool empty(); int dim(); void push( int val ); void pop(); void stampa(); }; bool pila::empty() { if(testa == NULL) return false; } int pila::dim() { elem *punta = 0; int i = 0; while(punta != NULL) { punta = testa->pun; i++; } return i; } void pila: ![]() { elem *nuova_testa; nuova_testa = new elem; nuova_testa->info = val; nuova_testa->pun = testa; testa = nuova_testa; } void pila::stampa() { pila a; while(testa != NULL) { cout << testa->info; a.testa = testa->pun; } } int main() { pila numeri; elem valori; int num; if(numeri.empty() == false) cout << "Pila Vuota." << endl; cout << numeri.dim() << endl << endl; cout << "Inserisci un numero nella pila: "; cin >> num; cout << numeri.dim() << endl << endl; numeri.stampa(); getch(); return 0; } |
![]() |
![]() |
![]() |
#4 |
Member
Iscritto dal: Feb 2006
Messaggi: 134
|
Errori:
1) in dim() inizializzi: elem *punta = 0 e subito dopo c'è while (punta != NULL) sarà elem *punta = testa, altrimenti nel ciclo quando entri? 2) la funzione stampa() è uguale alla dim(), solo che non incrementi il contatore ma scrivi il valore 3) nel main, dopo aver letto num manca un numeri.push(num)... Altrimenti la pila rimane vuota, no? Ciao. |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 22:20.