Domanda pila c++ ( puntatori )

Stato
Discussione chiusa ad ulteriori risposte.

p4zzo

Utente Bronze
9 Ottobre 2015
16
4
0
37
Ultima modifica da un moderatore:
Salve ragazzi, ho un po di confusione su come funzioni la pila con i puntatori, nell' inpila e nel fuoripila... potreste spiegarmi cosa avviene e come si codifica in c++ con i puntatori?
questo è il codice, penso sia corretto strutturalmente.
nodopila.h
C++:
ifndef _NODO_PILA_H
#define _NODO_PILA_H

#include <iostream>
#include <stdlib.h>
template <class T>
class nodo{
  
    public:
            typedef T tipoelem;
        /* Costruttore */
        nodo(){  
            prec=NULL;
            elemento = 0;
        };
        /* Distruttore */
        ~nodo(){
          
        };
        /* Operazioni su nodo*/
        void setElemento(tipoelem elem){ elemento=elem;
        };
      
        tipoelem getElemento(){    return elemento;
        };
      
        nodo<tipoelem> getPrec(){ return prec;
        };
      
        void setPrec(nodo<tipoelem> *p){ prec=p;;
        }
      
      
    private :
        tipoelem elemento;
        nodo<tipoelem> *prec;
  
};

#endif // _NODO_PILA_H

pilaptr.h
C++:
/* Pila Puntatori */
#ifndef _PILAPTR_H
#define _PILAPTR_H
#include <iostream>
#include <stdlib.h>
using namespace std;

#include "nodopila.h"

template <class T>
class pilaPtr
{
    public :
            typedef nodo<T> *posizione;
            typedef T tipoelem;
        /*Costruttore */
        pilaPtr();
        pilaPtr(int);
        /* Distruttore */
        ~pilaPtr();
        /* Operazioni su Pila */
        void creaPila();
        bool pilaVuota();
        tipoelem leggiPila() const;
        void fuoriPila();
        void inPila(tipoelem);
      
        /* funzioni di servizio */
        //void stampaPila();
      
    private:
         nodo<tipoelem> nodo;
         posizione testa;
};


/* Implementazione funzioni */
/*******************************************************************/
template<class T>
pilaPtr<T>::pilaPtr(){
    creaPila();
}
/*******************************************************************/

template<class T>
pilaPtr<T>::~pilaPtr(){
    this->testa=NULL;
}
/*******************************************************************/
  
template<class T>
void pilaPtr<T>::creaPila(){
    tipoelem ElementoNullo;
    nodo.setElemento(ElementoNullo);
    nodo.setPrec(NULL);
    testa=NULL;
}
/*******************************************************************/

template<class T>
bool pilaPtr<T>::pilaVuota(){
    return testa==NULL;
}
/*******************************************************************/

template<class T>
typename pilaPtr<T>::tipoelem pilaPtr<T>::leggiPila() const{
    return testa->getElemento();
}
/*******************************************************************/

template<class T>
void pilaPtr<T>::fuoriPila(){
  
    testa=testa->getPrec();
  
}
/*******************************************************************/

template<class T>
void pilaPtr<T>::inPila(tipoelem elem){
  
}
/*******************************************************************/

#endif // _PILAPTR_h
 
Non è chiaro quello che stai chiedendo. Esprimiti: qual è esattamente il tuo problema?
 
La funzione "inpila" dovrebbe servire ad aggiungere un elemento in cima allo stack. Quindi devi creare un nuovo nodo, assegnarli l' elemento e collegarlo alla testa. La funzione "fuoripila" dovrebbe fare esattamente il contrario. Cioè deve ritornare il valore dell' elemento che sta nel nodo in testa e deve togliere quel nodo dalla pila.
Inoltre, il tuo distruttore non è corretto, perché non elimini i nodi creati dinamicamente. In questo caso avresti dei memory leaks.
 
Ultima modifica da un moderatore:
cosi' ?
C++:
template<class T>
void pilaPtr<T>::inPila(tipoelem elem){
    pilaPtr<T>::posizione temp;
    temp->setElemento(elem);
    temp->setPrec(testa);
    testa=temp;
  
}
 
Non proprio. Devi creare e allocare dinamicamente un nuovo nodo. Ma l' hai provato il codice? Non puoi fare operazioni su un puntatore che non punta a nessun oggetto e per di più non inizializzato.
 
e vorrrei fare il debug da dev c++ , ho win 7 64 bit, ma mi crasha... comunque tu intendi aggiungere al codice precedente :
Codice (C++):

template<class T>
void pilaPtr<T>::inPila(tipoelem elem){
pilaPtr<T>: posizione temp;
temp = new posizione; ???
temp->setElemento(elem);
temp->setPrec(testa);
testa=temp;

}
 
Stato
Discussione chiusa ad ulteriori risposte.