
Originariamente inviata da
MItaly
Perfetto ho capito come funziona...però nel mio caso c'è un problema...Non posso rendere const le funzioni Next e Rewind in quanto queste modificano il puntatore Current...tuttavia non rendendo queste funzioni const non posso andare a compilare.
Codice completo di Lista.cpp
codice:
#include "Lista.h"#include <iostream>
#include <string>
using namespace std;
template<typename Tipo>
Lista<Tipo>::Lista()
{
InizioLista = new Nodo<Tipo>(NULL,NULL,NULL);
Current = InizioLista;
DimLista = 0;
}
template<typename Tipo>
Lista<Tipo>::Lista(const Lista<Tipo>& lista)
{
int i = 0;
this->InizioLista = new Nodo<Tipo>(NULL,NULL,NULL);
this->Current = this->InizioLista;
while(!lista.FineLista())
this->InserisciInCoda(lista.LeggiElemento(i++));
}
template<typename Tipo>bool Lista<Tipo>::ListaVuota() const
{
if(InizioLista == NULL)
return true;
else
return false;
}
template<typename Tipo>
bool Lista<Tipo>::FineLista() const
{
if(Current->LeggiProssimoIndirizzo() == NULL)
return true;
else
return false;
}
template<typename Tipo>
int Lista<Tipo>::DimensioneLista() const
{
return DimLista;
}
template<typename Tipo>
int Lista<Tipo>::PosizioneCursore(Lista<Tipo>* lista)
{
int indCursore = -1;
Nodo<Tipo>* Cursore = this->InizioLista;
while(Cursore != Current)
{
indCursore++;
Cursore = Cursore->LeggiProssimoIndirizzo();
}
return indCursore;
}
template<typename Tipo>
void Lista<Tipo>::InserisciInCoda(Tipo Elemento, Lista<Tipo>* lista)
{
static bool flag = false;
if(lista == NULL && !flag)
{
flag = true;
InserisciInCoda(Elemento,this);
flag = false;
Rewind();
return;
}
else
{
if(FineLista())
{
Nodo<Tipo>* NuovoElemento;
NuovoElemento = new Nodo<Tipo>(Elemento,lista->Current);
lista->Current->ScriviProssimoIndirizzo(NuovoElemento);
lista->DimLista++;
return;
}
else
{
Next();
InserisciInCoda(Elemento,lista);
}
}
}
template<typename Tipo>
void Lista<Tipo>::InserisciInPosizione(Tipo Elemento, int Indice, Lista<Tipo>* lista)
{
static bool flag = false;
Nodo<Tipo>* NuovoElemento;
if(lista == NULL && !flag)
{
if(Indice > DimensioneLista() - 1)
{
cout << "Indice oltre il limite...sara' effettuato un inserimento in coda..." << endl;
InserisciInCoda(Elemento,lista);
return;
}
flag = true;
InserisciInPosizione(Elemento, Indice, this);
flag = false;
Rewind();
return;
}
else
{
if(PosizioneCursore() == Indice)
{
NuovoElemento = new Nodo<Tipo>(Elemento);
Current->LeggiPrecedenteIndirizzo()->ScriviProssimoIndirizzo(NuovoElemento);
NuovoElemento->ScriviPrecedenteIndirizzo(Current->LeggiPrecedenteIndirizzo());
NuovoElemento->ScriviProssimoIndirizzo(Current);
lista->DimLista++;
return;
}
else
{
Next();
InserisciInPosizione(Elemento, Indice, lista);
}
}
}
template<typename Tipo>
void Lista<Tipo>::Next() const
{
if(!ListaVuota() && !FineLista())
Current = Current->LeggiProssimoIndirizzo();
}
template<typename Tipo>
void Lista<Tipo>::Rewind() const
{
Current = InizioLista;
}
template<typename Tipo>
void Lista<Tipo>::StampaElementi()
{
Rewind();
Next();
while(!FineLista())
{
cout << Current->LeggiElemento() << endl;
Next();
}
cout << Current->LeggiElemento();
}
template<typename Tipo>
void Lista<Tipo>::Ordina(bool Direzione, int Begin, int End)
{
int q;
int Dim = DimensioneLista() - 1;
if(End == -1)
End = Dim;
if(End > Dim)
cout << "Parametri di ordinamento errati!!!" << endl;
else
QuickSort(this,Begin,End);
}
template<typename Tipo>
Tipo Lista<Tipo>::LeggiElemento(int Indice) const
{
int i;
Tipo Elemento;
if(Indice > DimensioneLista())
cout << "Indice errato!!" << endl;
else
{
for(i = -1; i < Indice; i++)
Next();
Elemento = Current->LeggiElemento();
Rewind();
return Elemento;
}
}
template<typename Tipo>
void Lista<Tipo>::ScriviElemento(int Indice, Tipo Elemento)
{
int i;
if(Indice > DimensioneLista() - 1)
cout << "Indice errato!!" << endl;
else
{
for(i = -1; i < Indice; i++)
Next();
Current->ScriviElemento(Elemento);
Rewind();
}
}
template<typename Tipo>
int Partizione(Lista<Tipo>* lista, int Begin, int End)
{
Tipo Aux;
int i = Begin - 1;
int j = End + 1;
Tipo x = lista->LeggiElemento(Begin);
while(i < j)
{
while(lista->LeggiElemento(--j) > x);
while(lista->LeggiElemento(++i) < x);
if(i < j)
{
Aux = lista->LeggiElemento(i);
lista->ScriviElemento(i,lista->LeggiElemento(j));
lista->ScriviElemento(j,Aux);
}
}
return j;
}
template<typename Tipo>
void QuickSort(Lista<Tipo>* lista, int Begin, int End)
{
int q;
if(Begin < End)
{
q = Partizione(lista,Begin,End);
QuickSort(lista,Begin,q);
QuickSort(lista,q+1,End);
}
}
template<typename Tipo>
Lista<Tipo> Lista<Tipo>::FusioneLista(Lista<Tipo> Lista2)
{
Lista<Tipo> ListaFusa;
int i = 0, j = 0, k = 0;
while(!this->FineLista() && !Lista2.FineLista())
{
if(this->LeggiElemento(i) < Lista2.LeggiElemento(j))
ListaFusa.InserisciInCoda(this->LeggiElemento(i++));
else
ListaFusa.InserisciInCoda(Lista2.LeggiElemento(j++));
}
while(!this->FineLista())
ListaFusa.InserisciInCoda(this->LeggiElemento(i++));
while(!Lista2.FineLista())
ListaFusa.InserisciInCoda(Lista2.LeggiElemento(j++));
return ListaFusa;
}
template class Lista<int>;
template class Lista<string>;