ciao a tutti, sto creando la struttura dati pila con puntatori ma ho un problema con il metodo inpila(). inserisco i codici e poi spiego il problema:

nodop.h
codice:
#ifndef nodop_h
#define nodop_h

#include<iostream>
#include<stdlib.h>

using namespace std;

template<class tipoelem>
class nodop
{
   public:
      nodop();
      
      void setprec(nodop<tipoelem> *);
      nodop<tipoelem> *getprec();
      void setelem(tipoelem);
      tipoelem getelem();
   private:
      nodop<tipoelem> *precedente;
      tipoelem elemento;
};

#endif

template<class tipoelem>
nodop<tipoelem>::nodop()
{
   precedente = NULL;
   elemento = 0;
}

template<class tipoelem>
void nodop<tipoelem>::setprec(nodop<tipoelem> *pos)
{
   precedente = pos;
}

template<class tipoelem>
nodop<tipoelem> *nodop<tipoelem>::getprec()
{
   return(precedente);
}

template<class tipoelem>
void nodop<tipoelem>::setelem(tipoelem elem)
{
   elemento = elem;
}

template<class tipoelem>
tipoelem nodop<tipoelem>::getelem()
{
   return elemento;
}
pilap.h
codice:
#ifndef pilap_h
#define pilap_h

#include "nodop.h"
#include <iostream>
#include <stdlib.h>

using namespace std;

template<class tipoelem>
class pilap
{
   public:
      typedef nodop<tipoelem> *posizione;
      
      pilap();
      void creapila();
      bool pilavuota();
      tipoelem leggipila();
      void inpila(tipoelem);
      void fuoripila();
   private:
      nodop<tipoelem> nodo;
      posizione testa;
};

#endif

template<class tipoelem>
pilap<tipoelem>::pilap()
{
   creapila();
}

template<class tipoelem>
void pilap<tipoelem>::creapila()
{
   nodo.setelem(0);
   nodo.setprec(NULL);
   testa = NULL;
}

template<class tipoelem>
bool pilap<tipoelem>::pilavuota()
{
   return(testa == NULL);
}

template<class tipoelem>
tipoelem pilap<tipoelem>::leggipila()
{
   return(testa->getelem());
}

template<class tipoelem>
void pilap<tipoelem>::inpila(tipoelem elem)
{
   nodop<tipoelem> temp;
   
   if(pilavuota())
   {
      nodo.setelem(elem);
      testa = &nodo;
      cout << testa << "\n"; 
   }
   else
   {
      temp.setelem(elem);
      temp.setprec(testa);
      testa = &temp;
      cout << testa << "\n";
   }
}

template<class tipoelem>
void pilap<tipoelem>::fuoripila()
{
   testa = testa->getprec();
}
tespilap.cpp
codice:
#include "pilap.h"
#include<iostream>
#include<stdlib.h>

using namespace std;

int main()
{
   pilap<int> stack;
   
   cout << stack.pilavuota() << "\n\n";
   
   stack.inpila(10);
   
   cout << stack.leggipila() << "\n\n";
   
   cout << stack.pilavuota() << "\n\n";
   
   int i = 0;
   while(i < 10)
   {
      stack.inpila(i * 10);
      i++;
   }
   cout << stack.leggipila() << "\n\n";
   
   stack.fuoripila();
   cout << stack.leggipila() << "\n\n";
      
   system("pause");
   return 0;
}
in pratica nel metodo inpila, che serve per aggiungere un nodo in testa alla pila, non viene aggiornato il puntatore testa, il quale dopo l'inserimento del primo elemento punta sempre a quest'ultimo anzichè puntare all'ultimo elemento che viene man mano inserito nella pila. come mai?