#ifndef LISTACUR_H
#define LISTACUR_H
#include <stdlib.h>
#include <iostream>
#include "CellaListaCur.h"
#include "ListaLineare.h"
#define ERR -1
using namespace std;
template<class T>
class Lista : public ListaLineare<T,int>{
public:
typedef typename ListaLineare<T,int>:: tipoelem tipoelem;
typedef typename ListaLineare<T,int>:: posizione posizione;
Lista();
Lista(int);
Lista(const Lista<T>& );
~Lista();
// operatori
void creaLista();
bool listaVuota() const;
tipoelem leggiLista(posizione ) const;
void scriviLista(tipoelem , posizione );
posizione primoLista() const;
posizione ultimoLista() const;
bool fineLista(posizione ) const;
posizione succLista(posizione ) const;
posizione predLista(posizione ) const;
void insLista(tipoelem, posizione );
void cancLista(posizione );
//sovraccarico di operatori
Lista<T>& operator=(const Lista<T>&);
bool operator==(const Lista<T> &) const;
private:
void cambiaDimensione();
CellaListaCur<tipoelem> * elementi;
posizione primo;
posizione primoVuoto;
int dimensione; // dimensione del vettore che realizza la lista
int lunghezza; // lunghezza effettiva della lista
};
template <class T>
Lista<T>::Lista(){
Lista(10);
}
template <class T>
Lista<T>::Lista(int dim){
dimensione = dim;
primo = 0;
cout<<"\n COSTRUTTORE: dim: "<<dim<<" - dimensione: "<<dimensione<<" - primo: "<<primo<<"\n\n"<<endl;
elementi = new CellaListaCur<tipoelem>[dimensione];
if (elementi != NULL) {
cout<<"\n elementi allocato \n\n"<<endl;
int i;
for ( i=0; i<dimensione-1; i++) {
elementi[i].scriviCella(ERR,i+1);
cout<<i<<". ";
}
elementi[dimensione].scriviCella(ERR,ERR);
cout<<i<<". ";
}
else cout<<"\n elementi NON allocato \n\n"<<endl;
creaLista();
}
template< class T >
Lista< T >::Lista(const Lista<T>& lista) {
dimensione = lista.dimensione;
lunghezza = lista.lunghezza;
primo=lista.primo;
elementi = new CellaListaCur<T> [dimensione];
if (elementi != NULL) {
for (int i=0; i<dimensione; i++) {
elementi[i] = lista.elementi[i];
}
}
}
template <class T>
Lista<T>::~Lista(){
// delete [] elementi ;
}
template <class T>
void Lista<T>::creaLista(){
lunghezza = 0;
cout<<"\n creaLista: dimensione: "<<dimensione<<" - primo: "<<primo<<" - lunghezza: "<<lunghezza<<"\n\n"<<endl;
}
template <class T>
bool Lista<T> ::listaVuota()const{
return (lunghezza==0);
}
template <class T>
void Lista<T>::scriviLista(tipoelem a,posizione p){
if((0 < p) && (p <= lunghezza+1))
elementi[p-1].scriviCella(a,p-1);
}
template <class T> typename
Lista<T>::tipoelem Lista<T>::leggiLista(posizione p) const {
if((0 < p) && (p <= lunghezza+1))
return elementi[p-1].leggiCella();
else
return p;
}
template <class T> typename
Lista<T>::posizione Lista<T>::primoLista()const{
return primo;
}
template <class T> typename
Lista<T>::posizione Lista<T>::ultimoLista() const{
typename Lista<T>::posizione pos;
for(pos=primo; !fineLista(elementi[pos].getSuccessivo()); pos=succLista(pos)){
pos=elementi[pos].getSuccessivo();
}
return pos;
}
template <class T>
bool Lista<T>::fineLista(posizione p) const{
if((0 < p) && (p <= lunghezza+1))
return (p==lunghezza+1);
else
return false;
}
template <class T> typename
Lista<T>::posizione Lista<T>::succLista(posizione p) const {
if((0 < p) && (p <= lunghezza+1))
return elementi[p].getSuccessivo();
else{
cout<<"\n Non ci sono altri elementi";
return p;
}
}
template <class T> typename
Lista<T>::posizione Lista<T>::predLista(posizione p) const {
typename Lista<T>::posizione pos;
if((1 < p) && (p <= lunghezza+1)){
for(pos=primo; elementi[pos].getSuccessivo()<p;pos=succLista(pos)){
pos=elementi[pos].getSuccessivo();
}
return pos;
}
else
return p;
}
template <class T>
void Lista<T>:: insLista(tipoelem a,posizione pv){
typename Lista<T>::posizione pos;
cout<<"\ninsLista: tipoelem a: "<<a<<" - posizione pv: "<<pv<<"\n"<<endl;
cout<<"\ninsLista: dimensione: "<<dimensione<<" - primo: "<<primo<<" - lunghezza: "<<lunghezza<<"\n"<<endl;
if (lunghezza == dimensione){
cout<<"\nAUMENTA DIMENSIONE VETTORE LISTA\n"<<endl;
cambiaDimensione();
}
else
cout<<"\ninserisce elemento\n"<<endl;
if((primo == ERR)){
cout<<"\nprimo = ERR\n"<<endl;
primo=pv;
elementi[0].scriviCella(a,pv);//scritto primo elemento della lista
}
else{
cout<<"\nprimo <> ERR\n"<<endl;
// trova ultima posizione, scorrendo tutta la lista
for (pos=primo; !fineLista(pos); pos=succLista(pos))
{}
pv=elementi[pos].getSuccessivo();
lunghezza++; //incremento di conseguenza la variabile lunghezza
}
}
template <class T>
void Lista<T>::cancLista(posizione p){
if((0 < p) && (p <= lunghezza+1))
if(!listaVuota()){
//controllo se l'operazione è effettivamente eseguita su lista non vuota
elementi[predLista(p)].setSuccessivo(elementi[p].getSuccessivo());
lunghezza--;//decremento di conseguenza la variabile lunghezza
}
}
template<class T>
void Lista<T>::cambiaDimensione(){
cout<<"\ninizio cambiaDimensione\n"<<endl;
int oldDim;
CellaListaCur<T> * elemTemp;
oldDim = dimensione;
dimensione = dimensione *2;
cout<<"\nprima di inizializzare elemTemp \n"<<endl;
elemTemp = new CellaListaCur<T> [dimensione];
cout<<"\nprima del for \n"<<endl;
for (int i=0; i<oldDim; i++)
elemTemp[i]= elementi[i];
cout<<"\ndopo del for \n"<<endl;
//delete [] elementi;
elementi = elemTemp;
}
/* operatore di assegnamento */
template<class T>
Lista<T>& Lista<T>::operator=(const Lista<T>& l){
if (this != &l){ // attenzione agli autoassegnamenti: l = l
lunghezza = l.lunghezza;
//delete this.elementi;
for (int i=0; i<dimensione; i++)
elementi[i] = l.elementi[i];
}
return *this;
}
/* operatore di test di uguaglianza */
template<class T>
bool Lista<T>::operator==(const Lista<T> &l) const{
if (l.lunghezza != this.lunghezza)
return false;
for (int i=0; i<dimensione; i++)
if (this.elementi[i].leggiCella() != l.elementi[i].leggiCella())
return false;
return true;
}
#endif