Stampa errata

di il
4 risposte

Stampa errata

Salve, non capisco perchè mi stampa un valore casuale al posto del 5, il programma ha una lista con dei nodi che hanno dentro una pila, il metodo newpush dovrebbe creare un nuovo nodo e inserire il primo elemento nella pila del nodo appena creato, stampa dovrebbe stampare l'elemento cima di tutti i nodi della lista in ordine crescente dei valori della cima.
#include<iostream>
#include<sstream>
#include<string>
#include<fstream>
using namespace std;
template <class H>
class pila
{
	private:
		int cima;
		H* array;
		int dim;
	public:
		pila(int x)
		{
			dim=x;
			array=new H[dim];
			cima=-1;
		}
		void push(H x)
		{
			cima++;
			array[cima]=x;
		}
		void pop()
		{
			cima--;
		}
		H get()
		{
			return array[cima];
		}
};
template <class H>
class nodo
{
	private:
			nodo<H>* succ;
			pila<H> Pila;
			nodo<H>* prec;
		
	public:
			nodo(int x) : Pila(x)
			{
				prec=succ=0;	
			}
			void setsucc(nodo<H>* x)
			{
				succ=x;
			}
			nodo<H>* getsucc()
			{
				return succ;
			}
			void setprec(nodo<H>* x)
			{
				prec=x;
			}
			nodo<H>* getprec()
			{
				return prec;
			}
			pila<H> getpila()
			{
				return Pila;
			}
			void setpila(pila<H> x)
			{
				Pila=x;
			}
};
template <class H>
class lista
{
	private:
		nodo<H>* testa;
	public:
		lista()
		{
			testa=0;
		}
		void newpush(int dim,H x)
		{
			if(testa==0)
			{
				testa=new nodo<H>(dim);
				testa->getpila().push(x);
			}
			else
			{
				nodo<H>* nuovo=new nodo<H>(dim);
				nuovo->getpila().push(x);
				nuovo->setsucc(testa);
				testa->setprec(nuovo);
				testa=nuovo;
			}
		}
		void push(H x)
		{
			testa->getpila().push(x);
		}
		void pop()
		{
			testa->getpila().pop();
		}
		void ordina()
		{
			nodo<H>* temp=testa;
			for(nodo<H>* temp=testa; temp!=0; temp=temp->getsucc())
			{
				nodo<H>* k=temp;
				for(nodo<H>* cambio=temp->getsucc(); cambio!=0; cambio=cambio->getsucc())
				{
					if(k->getpila().get()>cambio->getpila().get())
					{
						k=cambio;
					}
				}
				pila<H> var=temp->getpila();
				temp->setpila(k->getpila());
				k->setpila(var);
			}
		}
		void stampa()
		{
			nodo<H>* temp=testa;
			while(temp!=0)
			{
				cout<<temp->getpila().get()<<" ";
				temp=temp->getsucc();
			}
		}
		
};
int main()
{
	lista<int> ogg;
	ogg.newpush(10,5);
//	ogg.newpush(10,1);
//	ogg.newpush(10,0);
//	ogg.newpush(10,3);
//	ogg.ordina();
	ogg.stampa();
	
}

4 Risposte

  • Re: Stampa errata

    darkman97 ha scritto:


    Salve, non capisco perchè mi stampa un valore casuale al posto del 5, il programma ha una lista con dei nodi che hanno dentro una pila, il metodo newpush dovrebbe creare un nuovo nodo e inserire il primo elemento nella pila del nodo appena creato, stampa dovrebbe stampare l'elemento cima di tutti i nodi della lista in ordine crescente dei valori della cima.
    Ciao.
    La funzione pila<H> getpila() restituisce una copia di Pila, non Pila, per cui quando richiami la push(x) all'interno della newpush(int, H) vai ad agire (incremento dell'indice di cima del vettore ed inserimento dell'elemento) non sulla pila che hai allocato in precedenza, ma su una sua copia.


    Per farlo funzionare, è bastato aggiustare la getpila in modo da fargli restituire un puntatore a Pila:
    
    pila<H>* getpila()
    	{
    		return &Pila;
    	}
    
    Quindi, la newpush diventa:
    void newpush(int dim, H x)
    	{
    		if (testa == 0)
    		{
    			testa = new nodo<H>(dim);
    			testa->getpila()->push(x); //NON più il punto, ma -> !!!
    			//prova
    			cout<<testa->getpila()->get()<<endl;
    		}
    		else
    		{
    			nodo<H>* nuovo = new nodo<H>(dim);
    			nuovo->getpila()->push(x); // Lo stesso!!
    			nuovo->setsucc(testa);
    			testa->setprec(nuovo);
    			testa = nuovo;
    		}
    	}
    Il ciclo di stampa diventa:
    
    while (temp != 0)
    		{
    			cout << temp->getpila()->get() << " ";
    			temp = temp->getsucc();
    		}
    
    E insomma tutte le funzioni che richiamano getpila() per poi accedere ad un elemento del valore di ritorno dovranno essere seguite dall'operatore -> e non più dal punto.
  • Re: Stampa errata

    Oppure, se ti piace la sintassi con il punto (e/o lo stile c++),
    
             pila<H>& getpila()
             {
                return Pila;
             }
    
  • Re: Stampa errata

    Oppure fare proprio una funzione getpila separata che restituisca il puntatore o il reference, e ternersi l'originale da usarsi un sola lettura. O ancora aggiungere un costruttore di Pila<H> (int dim, H) in modo da allocare l'oggetto direttamente.
    Penso che possa diventare anche più comodo definire la struttura nodo direttamente nella classe Lista.
  • Re: Stampa errata

    Grazie mille a entrambi, non ci pensavo proprio che stavo lavorando con una copia al posto dell'originale..grazie ancora!
Devi accedere o registrarti per scrivere nel forum
4 risposte