Guarda ti passo il codice che ho riportato pari pari dal manuale
la classe nodo
/*
* nodo.h
*
* Created on: 26/giu/2013
* Author: gen
*/
#ifndef NODO_H_
#define NODO_H_
template <class t> class list;//predichiarazione necessaria per la funzione friend
template <class t>
class nodo{
friend class list <t>;
public:
nodo(const t &);//riceve in ingresso un tipo di dato generico
t getData()const;
private:
t data;
nodo <t> *next;
};
//costruttore
template <class t>
nodo<t>::nodo(const t & info):data(info),next(0){}
template <class t>
t nodo<t>::getData()const{
return data;
}
#endif
questa è la classe lista :
/*
* lista.h
*
* Created on: 26/giu/2013
* Author: gen
*/
#ifndef LISTA_H_
#define LISTA_H_
#include <iostream>
#include "nodo.h"
using namespace std;
template <class t>
class list{
public:
list();
~list();
void insertFront(const t &);
void insertBack(const t&);
bool removeFront(t&);
bool removeBack(t&);
bool isEmpty()const;
void print() const;
private:
nodo <t> *firstPtr;
nodo <t> *lastPtr;
//funzione di utiliy per allocare un nuovo nodo
nodo <t> *getNewNodo(const t&);
private:
};
template <class t>
nodo <t>* list<t>::getNewNodo(const t& info){
return new nodo <t> (info);
}
template <class t>
list <t>::list():firstPtr(0),lastPtr(0){}
template <class t>
list <t>::~list(){
if(!isEmpty()){
cout<<"\nDistruggo tutti i nodi\n";
nodo <t> *currentPtr;
nodo <t> *tempPtr;
while(currentPtr!=0){
tempPtr=currentPtr;
cout<<"\n"<<tempPtr;
currentPtr=currentPtr->next;
delete tempPtr;
}
}
cout<<"\n Tutti i nodi sono distrutti\n";
}
template <class t>
void list <t>::insertFront(const t& value){
nodo <t> *newPtr=getNewNodo(value);
if(isEmpty())
firstPtr=lastPtr=newPtr;
else{
newPtr->next=firstPtr;
firstPtr=newPtr;
}
}
template <class t>
void list<t>::insertBack(const t& value){
nodo <t> *newPtr;//creo un punatore ad un nuovo nodo di tipo t
newPtr=getNewNodo(value);//e gli assegno l'indirizzo del nuovo nodo creato;
if(isEmpty())
firstPtr=lastPtr=newPtr;
else{
lastPtr->next=newPtr;
lastPtr=newPtr;
}
}
template <class t>
bool list<t>::removeFront(t & value){
if (isEmpty()){
return false;
}
else{
if(firstPtr==lastPtr)//se i due puntatori sono uguali c'è un solo nodo che
firstPtr=lastPtr=0;//se rimosso svuota la lista;
nodo <t> *tempPtr=firstPtr;
firstPtr=firstPtr->next;
value=tempPtr->data;//restituisce il contenuto del nodo cancellato
delete tempPtr;
return true;
}
}
template <class t>
bool list<t>::removeBack(t& value){
if(isEmpty())
return false;
else{
nodo <t> *tempPtr=lastPtr;
if(firstPtr==lastPtr)
firstPtr=lastPtr=0;
else{
nodo<t> *currentPtr=firstPtr;
while(currentPtr->next!=lastPtr)
currentPtr=currentPtr->next;
lastPtr=currentPtr;
currentPtr->next=0;
}
value=tempPtr->data;
delete tempPtr;
}
}
template <class t>
bool list <t>::isEmpty()const{
return firstPtr==0;
}
template <class t>
void list<t>::print()const{
cout<<"\nStampa della lista: \n";
if(isEmpty()){
cout<<"\nLa lista è vuota\n";
return;
}
nodo <t> *currentPtr=firstPtr;
while(currentPtr!=0){
cout<<currentPtr->data<<" ";
currentPtr=currentPtr->next;
}
}
#endif /* LISTA_H_ */
a me non sembra rispetti molto ciò che mi hai appena detto