codice:
* Liste: Rappresentazione collegata circolare (con sentinella)
* realizzata mediante doppi puntatori (o simmetrica)
*/
#include "listap.h"
/******************************************************************************/
/*Metodi classe_spazio*/
/******************************************************************************/
template< class T, class P >
classe_spazio Lista<T,P>::spazio;
template< class T, class P >
classe_spazio<T,P>::classe_spazio()
{
int i;
//inizializzo l'elemento 0 e lo collego al primo
componenteSpazio_testa = 0;
spazio[0].elemento = 0;
spazio[0].precedente = -1;
spazio[0].successivo = 1;
//inizializzo gli elementi da 1 a N-1 collegandoli tra loro
for(i=1; i < N-1; i++)
{
spazio[i].elemento = 0;
spazio[i].precedente = i-1;
spazio[i].successivo = i+1;
}
//inizializzo l'N-esimo elemento
componenteSpazio_coda = i;
spazio[i].elemento = 0;
spazio[i].precedente = i-1;
spazio[i].successivo = -1;
}
template< class T, class P >
posizione classe_spazio<T,P>::getTesta()
{
return componenteSpazio_testa;
}
template< class T, class P >
posizione classe_spazio<T,P>::getCoda()
{
return componenteSpazio_coda;
}
template< class T, class P >
void classe_spazio<T,P>::setCoda(posizione posizione)
{
componenteSpazio_coda = posizione;
}
template< class T, class P >
void classe_spazio<T,P>::setTesta(posizione posizione)
{
componenteSpazio_testa = posizione;
}
/******************************************************************************/
/*Metodi classe lista*/
/******************************************************************************/
template< class T, class P >
Lista<T,P>::Lista()
{
crealista();
}
template< class T, class P >
void Lista<T,P>::crealista()
{
posizione Scoda, Stesta, temp;
Scoda = spazio.getCoda();
//Stesta = spazio.getTesta();
if(Scoda == -1)
{
cout << endl << "Errore: Non c'e' spazio per creare la nuova lista" << endl;
}
else
{
//Assegna alla coda la posizione
testa = Scoda;
//Assegno alla coda la posizione di testa perchè la lsita e' di un solo elemento
coda = testa;
spazio.setCoda(spazio[Scoda].precedente);
temp = spazio[Scoda].precedente;
spazio[Scoda].precedente = -1;
spazio[temp].successivo = -1;
}
}
template< class T, class P >
bool Lista<T,P>::listavuota() const
{
bool ritorno;
if(testa == -1)
{
ritorno = true;
}
else
{
ritorno = false;
}
return ritorno;
}
template< class T, class P >
Lista<T,P>::posizione Lista<T,P>::primoLista() const
{
return testa;
}
template< class T, class P >
Lista<T,P>::posizione Lista<T,P>::succlista(Lista::posizione p) const
{
posizione ele = -1;
/*Precondizione = La posizione passata non deve essere maggiore del
numero massimo di elementi del vettore spazio*/
if((p >= 0) && (p < N))
{
ele = spazio[p].successivo;
}
return ele;
}
template< class T, class P >
Lista<T,P>::posizione Lista<T,P>::preclista(Lista::posizione p) const
{
posizione ele = -1;
/*Precondizione = La posizione passata non deve essere maggiore del
numero massimo di elementi del vettore spazio*/
if((p >= 0) && (p < N))
{
ele = spazio[p].precedente;
}
return ele;
}
template< class T, class P >
bool Lista<T,P>::finelista(Lista::posizione p) const
{
return (p==coda);
}
tipoelem Lista::leggilista(posizione p) const
{
tipoelem ele = -1;
/*Precondizione = La posizione passata non deve essere maggiore del
numero massimo di elementi del vettore spazio*/
if((p >= 0) && (p < N))
{
ele = spazio[p].elemento;
}
return ele;
}
template< class T, class P >
void Lista<T,P>::scrivilista(tipoelem a, posizione p)
{
spazio[p].elemento = a;
/*Precondizione = La posizione passata non deve essere maggiore del
numero massimo di elementi del vettore spazio*/
if((p >= 0) && (p < N))
{
spazio[p].elemento = a;
}
}
template< class T, class P >
void Lista<T,P>::inslista(tipoelem a, Lista::posizione p)
{
/*Precondizione = La posizione passata non deve essere maggiore del
numero massimo di elementi del vettore spazio*/
if((p >= 0) && (p < N))
{
//Verifico che la lista spazio non è vuota
if(spazio.getCoda() != -1)
{
posizione NCodaSpazio;
NCodaSpazio = spazio[spazio.getCoda()].precedente;
//debug
//cout << NCodaSpazio << endl;
//Caso in cui sto aggiungendo un elemento in mezzo alla lista
if(testa != p)
{
//Setto i valori del nuovo elemento che sto inserendo in posizione p
spazio[spazio.getCoda()].elemento = a;
spazio[spazio.getCoda()].successivo = p;
spazio[spazio.getCoda()].precedente = spazio[p].precedente;
spazio[p].precedente = spazio.getCoda();
spazio[spazio[p].precedente].successivo= spazio.getCoda();
}
//Controllo se l'elemento che sto inserendo sostituirà la testa
if(testa == p)
{
testa = spazio.getCoda();
//Setto i valori del nuovo elemento che sto inserendo in posizione p
spazio[spazio.getCoda()].elemento = a;
spazio[spazio.getCoda()].successivo = p;
spazio[spazio.getCoda()].precedente = -1;
spazio[p].precedente = spazio.getCoda();
}
//Caso in cui la lista è vuota e sto inserendo il primo elemento
if(listavuota())
{
testa = spazio.getCoda();
coda = testa;
spazio[spazio.getCoda()].successivo = -1;
spazio[spazio.getCoda()].precedente = -1;
spazio[spazio.getCoda()].elemento = a;
}
spazio.setCoda(NCodaSpazio);
spazio[NCodaSpazio].successivo = -1;
}
else
{
cout << "Errore: Non c'e' spazio per inserire l'elemento" << endl;
}
}
else
{
cout << "Posizione non corretta" << endl;
}
}
template< class T, class P >
void Lista<T,P>::canclista(Lista::posizione p)
{
/*Precondizione = La posizione passata non deve essere maggiore del
numero massimo di elementi del vettore spazio*/
if((p >= 0) && (p < N))
{
//debug
//cout << "Testa: " << testa << " Coda: " << coda << " Posizione: " << p << endl;
//Cancellamento dell'elemento dalla lista*************************************
//sto cancellando un elemento centrale
if((p != testa) && (p != coda))
{
spazio[spazio[p].precedente].successivo = spazio[p].successivo;
spazio[spazio[p].successivo].precedente = spazio[p].precedente;
//debug
//cout << "Cancello un elemento centrale" << endl;
}
//sto cancellando la testa
if((p == testa) && (p != coda))
{
spazio[spazio[p].successivo].precedente = -1;
testa = spazio[p].successivo;
//debug
//cout << "Cancello la testa" << endl;
}
//sto cancellando la coda
if((p != testa) && (p == coda))
{
spazio[spazio[p].precedente].successivo = -1;
coda = spazio[p].precedente;
//debug
//cout << "Cancello la coda" << endl;
}
//la lista è di un solo elemento
if((p == testa) && (p == coda))
{
testa = -1;
coda = -1;
}
posizione temp = spazio.getCoda();
//Accodamento della cella eliminata alla lista Spazio*************************
//caso in cui la lista spazio era vuota
if(temp == -1)
{
//debug
//cout << "La lista SPAZIO era vuota" << endl;
spazio.setTesta(p);
spazio.setCoda(p);
spazio[p].precedente = -1;
spazio[p].successivo = -1;
spazio[p].elemento = 0;
}
else //tutti gli altri casi
{
spazio[temp].successivo = p;
spazio[p].precedente = temp;
spazio[p].successivo = -1;
spazio[p].elemento = 0;
spazio.setCoda(p);
}
}
else
{
cout << "Posizione non corretta" << endl;
}
}
/******************************************************************************/
/*Metodi classe lista*/
/******************************************************************************/
template< class T, class P >
int Superclasse<T,P>::lunghezza()
{
int cont=0;
posizione appo;
if(listavuota()==true)
cont=0;
else
{
appo=primoLista();
for(;finelista(appo)==false;appo=succlista(appo))
{
cont++;
}
}
return cont;
}
template< class T, class P >
void Superclasse<T,P>::inverti()
{
posizione appo_testa;
posizione appo_coda;
int index;
int lungh;
tipoelem val_appo;
if(listavuota()!=true)
{
lungh=lunghezza();
lungh=lungh/2;
appo_testa=primoLista();
appo_coda=primoLista();
for(;finelista(appo_coda)==false;appo_coda=succlista(appo_coda));
appo_coda = preclista(appo_coda);
for(index=0;index<lungh;index++)
{
//val_appo = spazio[appo_testa].elemento;
val_appo = leggilista(appo_testa);
//spazio[appo_testa].elemento = spazio[appo_coda].elemento;
scrivilista(leggilista(appo_coda), appo_testa);
//spazio[appo_coda].elemento = val_appo;
scrivilista(val_appo, appo_coda);
appo_testa=succlista(appo_testa);
appo_coda=preclista(appo_coda);
}
}
}
template< class T, class P >
bool Superclasse<T,P>::palindroma()
{
posizione appo_testa;
posizione appo_coda;
int index;
int lungh;
tipoelem val_appo;
bool res=true;
if(listavuota()!=true)
{
lungh= lunghezza();
lungh=lungh/2;
appo_testa=primoLista();
appo_coda=primoLista();
for(;finelista(appo_coda)==false ; appo_coda=succlista(appo_coda));
appo_coda = preclista(appo_coda);
for(index=0;index<lungh && (res==true);index++)
{
//if(spazio[appo_testa].elemento != spazio[appo_coda].elemento)
if(leggilista(appo_testa) != leggilista(appo_coda))
res=false;
appo_testa=succlista(appo_testa);
appo_coda=preclista(appo_coda);
}
}
return res;
}