ciao a tutti, sto facendo la lista con vettore e relativo test per controllare se i metodi funzionano correttamente. nel testare la lista ho notato che il metodo inslista non fa quello che dovrebbe fare, cioè spostare in avanti tutti gli elementi che si trovano dopo la posizione indicata dall'argomento del metodo inslista. secondo me il codice è corretto però non riesco a capire dove sta l'errore. posto i codici:
listav.h
codice:
#ifndef listav_h
#define listav_h
#include<iostream>
#include<stdlib.h>
using namespace std;
template<class tipoelem>
class listav
{
public:
typedef int posizione;
listav(int);
void crealista();
bool listavuota();
posizione primolista();
bool finelista(posizione);
posizione predlista(posizione);
posizione succlista(posizione);
tipoelem leggilista(posizione);
void scrivilista(posizione, tipoelem);
void inslista(posizione, tipoelem);
void canclista(posizione);
void stampalista();
private:
tipoelem *array;
int maxdim;
int lunglista;
};
#endif
template<class tipoelem>
listav<tipoelem>::listav(int dimensione)
{
maxdim = dimensione;
crealista();
}
template<class tipoelem>
void listav<tipoelem>::crealista()
{
array = new tipoelem[maxdim];
lunglista = 0;
}
template<class tipoelem>
bool listav<tipoelem>::listavuota()
{
return(lunglista == 0);
}
template<class tipoelem>
typename listav<tipoelem>::posizione listav<tipoelem>::primolista()
{
if(!this->listavuota())
return 0;
else
cerr << "lista vuota. operatore primolista() non applicabile. ";
}
template<class tipoelem>
bool listav<tipoelem>::finelista(typename listav<tipoelem>::posizione pos)
{
return(pos == (lunglista - 1));
}
template<class tipoelem>
typename listav<tipoelem>::posizione listav<tipoelem>::predlista(typename listav<tipoelem>::posizione pos)
{
if(pos == (lunglista - 1))
return 0;
else
return (pos + 1);
}
template<class tipoelem>
typename listav<tipoelem>::posizione listav<tipoelem>::succlista(typename listav<tipoelem>::posizione pos)
{
if(pos == 0)
return (lunglista - 1);
else
return (pos - 1);
}
template<class tipoelem>
tipoelem listav<tipoelem>::leggilista(typename listav<tipoelem>::posizione pos)
{
return(array[pos]);
}
template<class tipoelem>
void listav<tipoelem>::scrivilista(typename listav<tipoelem>::posizione pos, tipoelem elem)
{
array[pos] = elem;
}
template<class tipoelem>
void listav<tipoelem>::inslista(typename listav<tipoelem>::posizione pos, tipoelem elem)
{
if(lunglista < maxdim) //si può inserire l'elemento?
{
if(pos <= (lunglista - 1)) //ci sono elementi da spostare?
{
for(int i = (lunglista - 1); i >= pos; i--) //spostamento degli elementi
array[i + 1] = array[i];
array[pos] = elem;
}
else
array[pos] = elem;
++lunglista;
}
else
cerr << "lista piena.\n\n";
}
template<class tipoelem>
void listav<tipoelem>::canclista(typename listav<tipoelem>::posizione pos)
{
if(lunglista > 0) //si può eliminare?
{
if(pos < (lunglista - 1))
{
for(int i = (pos + 1); i < lunglista; i--)
array[i - 1] = array[i];
}
else
{
array[pos] = 0;
}
lunglista--;
}
else
cerr << "lista vuota.\n\n";
}
template<class tipoelem>
void listav<tipoelem>::stampalista()
{
typename listav<tipoelem>::posizione p = this->primolista();
cout << "lunglista = " << lunglista << "\n";
while(p != (lunglista - 1))
{
cout << this->leggilista(p) << "\n";
p = this->succlista(p);
}
cout << this->leggilista(p) << "\n";
}
in pratica ho notato l'anomalia eseguendo l'inserimento, tramite ciclo, di 10 elementi nella lista (istruzione in rosso).
testlistav.cpp
codice:
#include "listav.h"
#include<iostream>
#include<stdlib.h>
using namespace std;
int main()
{
listav<int> list(20);
listav<int>::posizione p;
cout << "listavuota() = " << list.listavuota() << "\n\n";
cout << "primolista() = " << list.primolista() << "\n\n";
list.inslista(0, 10);
cout << "primolista() = " << list.primolista() << "\n\n";
cout << "leggilista(primolista()) = " << list.leggilista(list.primolista()) << "\n\n";
list.scrivilista(list.primolista(), 20);
cout << "leggilista(primolista()) = " << list.leggilista(list.primolista()) << "\n\n";
cout << "finelista(primolista()) = " << list.finelista(list.primolista()) << "\n\n";
for(int i = 0; i < 10; i++)
list.inslista(list.primolista(), (i * 10));
cout << "leggilista(primolista()) = " << list.leggilista(list.primolista()) << "\n";
p = list.succlista(list.primolista());
cout << "leggilista(p) = " << list.leggilista(p) << "\n";
list.stampalista();
cout << "\n";
system("pause");
return 0;
}
chi mi aiuta a risolvere il problema?