PDA

View Full Version : [c++] Pila con liste


francescosalvaggio
27-11-2006, 14:04
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. :mc:

#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::push(int val, pila& pp)
{
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;
}

marco.r
27-11-2006, 14:16
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:

bool empty();
int dim();
void push(int val);

3 - Nel caso di dim prendi sempre lo stesso puntatore, ovvero il secondo elemento della lista.
4 - Per la push potresti usare una soluzione molto piu' semplice, basta aggiungere elementi davanti la testa.
qualcosa come il seguente:

void pila::push( int val )
{
nuova_testa = new elem;
nuova_testa->info = val;
nuova_testa->pun = testa;
testa = nuova_testa;
}

francescosalvaggio
27-11-2006, 14:37
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::push( int val )
{
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;
}

Volutomitra
27-11-2006, 20:03
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.