#ifndef NODOLISTA_H
#define NODOLISTA_H
typedef int elementoLista;
class NodoLista
{
public :
//Costruttore base della lista con puntatore
NodoLista();
//Costruttore con due argomenti della lista con puntatore ogni nodo contiene il tipo elem e il puntatore all'elemento successivo
NodoLista(elementoLista,NodoLista*);
//Distruttore della lista
~NodoLista();
//Metodo getter dell'elemento della lista
elementoLista getEtichetta();
//Metodo setter che modifica l'elemnto della lista
void setEtichetta(elementoLista);
//Metodo getter che prende il riferimento all'elemento successivo
NodoLista* getSuccessivo();
//Metodo setter che modifica il riferimento all' elemento successivo
void setSuccessivo(NodoLista*);
private:
elementoLista etichetta;
NodoLista* successivo;
};
#endif
---------------
#include <iostream>
#include <cstdlib>
#include "NodoLista.h"
using namespace std;
//Costruttore base che inizializza il campo etichetta a zero e il puntatore dell'elemento successivo a NULL
NodoLista::NodoLista()
{
etichetta=0;
successivo=NULL;
}
//Costruttore che inizializza il campo etichetta e il puntatore all' elemento successivo
NodoLista::NodoLista(elementoLista e,NodoLista* succ)
{
etichetta=e;
successivo=succ;
}
//Distruttore
NodoLista::~NodoLista() {}
//Metodo che va a prendere il campo etichetta
elementoLista NodoLista::getEtichetta()
{
return (etichetta);
}
//Metodo che mi modifica il campo etichetta
void NodoLista::setEtichetta(elementoLista e)
{
etichetta=e;
}
//Metodo che mi restituisce il riferimento all'elemento successivo
NodoLista* NodoLista::getSuccessivo()
{
return (successivo);
}
//Metodo che mi modifica il puntatore all'elemento successivo
void NodoLista::setSuccessivo(NodoLista* succ)
{
successivo=succ;
}
-----------------------
#ifndef LISTAPTR_H
#define LISTAPTR_H
#include "NodoLista.h"
typedef NodoLista* posizione;
class ListaPtr
{
public:
ListaPtr();
~ListaPtr();
void creaLista();
void distruggiLista();
bool listaVuota();
elementoLista leggiLista(posizione);
void scriviLista(elementoLista,posizione);
posizione primoLista();
bool fineLista(posizione);
posizione succLista(posizione);
posizione predLista(posizione);
void insLista(elementoLista,posizione);
void cancLista(posizione);
posizione ultimoLista();
private:
posizione primo;
};
#endif
-----------------------
#include <iostream>
#include <cstdlib>
#include "ListaPtr.h"
using namespace std;
//Il costruttore mi crea semplicemente la lista con puntatore
ListaPtr::ListaPtr() {
creaLista();
}
//Distruttore che elimina tutti gli elementi della lista
ListaPtr::~ListaPtr() {
distruggiLista();
}
//Creando la lista Imposto il puntatore Null
void ListaPtr::creaLista()
{
primo=NULL;
}
//Metodo per eliminare tutti gli elementi della lista
void ListaPtr::distruggiLista()
{
posizione tmp;
tmp=primo;
while(tmp!=NULL)
{
cancLista(tmp);
tmp=primo;
}
}
//Metodo che mi controlla se la lista è vuota cioè se il puntatore punta a Null
bool ListaPtr::listaVuota()
{
return (primo==NULL);
}
//Metodo per leggere un elemento della lista
elementoLista ListaPtr::leggiLista(posizione p)
{
if(!fineLista(p))
return p->getEtichetta();
}
//Metodo per scrivere un elemento all'interno di una lista
void ListaPtr::scriviLista(elementoLista e,posizione p)
{
if(!fineLista(p))
p->setEtichetta(e);
}
//Metodo che mi restituisce il primo elemento della lista
posizione ListaPtr:rimoLista()
{
return(primo);
}
//Metodo boolean che mi dice se la lista è finita
bool ListaPtr::fineLista(posizione p)
{
return(p==NULL);
}
//Metodo che mi ritorna l'elemento successivo della lista
posizione ListaPtr::succLista(posizione p)
{
if(!fineLista(p))
return (p->getSuccessivo());
else
return (NULL);
}
//Metodo che mi ritorna l'elemento precedente della lista
posizione ListaPtr:redLista(posizione p)
{
if(p==primo)
return (NULL);
else
{
posizione tmp;
tmp=primo;
while (tmp->getSuccessivo()!=p)
tmp=tmp->getSuccessivo();
return(tmp);
}
}
//Metodo che inserisce un elemento all'interno della lista
void ListaPtr::insLista(elementoLista e,posizione p)
{
posizione tmp;
tmp=new NodoLista(e,p);
if(p==primo)
primo=tmp;
else
predLista(p)->setSuccessivo(tmp);
}
//Metodo che cancella un elemento all'interno della lista
void ListaPtr::cancLista(posizione p)
{
if((!listaVuota()) && (p!=NULL))
{
if(p==primo)
{
primo=p->getSuccessivo();
delete(p);
}else {
predLista(p)->setSuccessivo(p->getSuccessivo());
delete(p);
}
}
}
//Metodo che mi restituisce l'ultimo elemento della lista
posizione ListaPtr::ultimoLista()
{
posizione tmp;
tmp=primo;
while (tmp->getSuccessivo() != NULL)
tmp=tmp->getSuccessivo();
return (tmp);
}
--------------------
//Rivedere l'epurazione
#include <cstdlib>
#include <iostream>
#include"ListaPtr.h"
using namespace std;
//Metodo che mi carica gli elementi della lista
void caricaLista(ListaPtr &l,int nElementi)
{
posizione pos;
elementoLista a;
int count;
l.creaLista();
pos = l.primoLista();
for(count=1;count<=nElementi;++count)
{
cout<<"Inserisci l'elemento numero:"<<count<<" della lista"<<endl;
cin>>a;
l.insLista(a,pos);
pos=l.succLista(pos);
}
}
//Metodo che stampa gli elementi della lista
void stampaLista(ListaPtr& l) {
if (!l.listaVuota()) {
posizione pos;
elementoLista a;
pos=l.primoLista();
while (!l.fineLista(pos)) {
a=l.leggiLista(pos);
cout<<a<<" ";
pos=l.succLista(pos);
}
cout << endl;
} else
cout<<"< >"<<endl;
}
//Metodo che ricerca un elemento all'interno di una lista
void ricercaLista(ListaPtr& l,elementoLista elem)
{
if(!l.listaVuota())
{
posizione pos;
int c=0;
elementoLista a;
bool trovato=false;
pos=l.primoLista();
while(!l.fineLista(pos))
{
c++;
a=l.leggiLista(pos);
if(a==elem)
{
trovato=true;
cout<<"L'elemento e'stato trovato in posizione "<<c<<endl;
}
pos=l.succLista(pos);
}
if(trovato==false){
cout<<"L'elemento non e'presente all interno della lista"<<endl;
}
}else
cout<<"Non sono presenti elementi nella lista"<<endl;
}
//Metodo che elimina i duplicati della lista
void epuraLista(ListaPtr& l)
{
if(!l.listaVuota())
{
posizione pos,pos1;
elementoLista a,b;
pos=l.primoLista();
pos1=l.primoLista();
while(!l.fineLista(pos))
{
a=l.leggiLista(pos);
pos1=l.succLista(pos);
while(!l.fineLista(pos1))
{
b=l.leggiLista(pos1);
if(a==b)
l.cancLista(pos1);
else
pos1=l.succLista(pos1);
}
pos=l.succLista(pos);
}
} else
cout<<"La lista non contiene elementi"<<endl;
}
//Metodo che costruisce una lista facendo la differenza dell'elemento successivo con quello precedente
void costruisciLista(ListaPtr &l,ListaPtr &m)
{
m.creaLista();
if(!l.listaVuota())
{
posizione pos,pos1,pos2;
elementoLista a,b,c;
pos=l.primoLista();
pos1=l.succLista(pos);
pos2=m.primoLista();
while(!l.fineLista(pos1))
{
a=l.leggiLista(pos);
b=l.leggiLista(pos1);
c=(b-a);
m.insLista(c,pos2);
pos1=l.succLista(pos1);
pos=l.succLista(pos);
pos2=m.succLista(pos2);
}
}
}
int main (int argc,char *argv[])
{
ListaPtr L,M;
int n;
elementoLista elem;
cout<<"Di quanti elementi deve essere formata la lista?"<<endl;
cin>>n;
caricaLista(L,n);
cout<<"L: ";
stampaLista(L);
cout<<"Inserisci l'elemento da ricercare all'interno della lista"<<endl;
cin>>elem;
ricercaLista(L,elem);
cout<<"Epurazione degli elementi della lista "<<endl;
epuraLista(L);
stampaLista(L);
cout<<"Costruzione Lista"<<endl;
costruisciLista(L,M);
stampaLista(M);
system("pause");
return 0;
}
Mio Messaggio per Help
Ho la seguente struttura dati lista che importata come progetto funziona alla grande l'unico problema sorge quando inserisco dei duplicati nella lista e applico la procedura epurazione per rimuoverli il programma va in loop sul secondo while.
La cosa strana è che nella implementazione con vettore la procedura identica funziona e secondo alcuni libri dovrebbe funzionare anche per quella con puntatori per rispettare il requisito di astrazione funzionale.
Non è che i puntatori mi stanno facendo impazzire????