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
in pratica ho notato l'anomalia eseguendo l'inserimento, tramite ciclo, di 10 elementi nella lista (istruzione in rosso).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"; }
testlistav.cpp
chi mi aiuta a risolvere il problema?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; }

Rispondi quotando