ciao ragazzi, posto un altro problema sulle liste che non riesco a risolvere: ho sovraccaricato l'operatore relazionale < nella classe lista per adattarlo alle stringhe (ho rappresentato le stringhe come puntatori a carattere). secondo me il codice che ho scritto per sovraccaricare l'operatore è corretto però nel codice di prova che ho fatto mi da sempre come risultato il valore booleano vero anche quando il confronto è falso. dove ho sbagliato? vi posto i codici.
listap.h
esercizio4codice:#ifndef _LISTAP_H #define _LISTAP_H #include <iostream> using namespace std; template<class T> class lista { private: typedef T tipoelem; struct nodo { nodo *precedente; tipoelem elemento; nodo *successivo; }; public: typedef nodo * posizione; posizione sentinella; lista(); void crealista(); bool listavuota(); posizione primolista(); bool finelista(posizione); void inslista(posizione&, tipoelem&); void canclista(posizione&); tipoelem leggilista(posizione); void scrivilista(posizione&, tipoelem&); posizione predlista(posizione); posizione succlista(posizione); bool operator<(const char *); bool operator>(char *); }; #endif template<class T> lista<T>::lista() { crealista(); } template<class T> void lista<T>::crealista() { sentinella = (posizione)malloc(sizeof(nodo)); tipoelem elemnullo = 0; sentinella->precedente = sentinella; sentinella->elemento = elemnullo; sentinella->successivo = sentinella; } template<class T> bool lista<T>::listavuota() { return((sentinella->precedente == sentinella) && (sentinella->successivo == sentinella)); } template<class T> typename lista<T>::posizione lista<T>::primolista() { return(sentinella->successivo); } template<class T> bool lista<T>::finelista(posizione p) { return(p->successivo == sentinella); } template<class T> void lista<T>::inslista(lista<T>::posizione &p, tipoelem& elem) { posizione temp = new nodo; temp->elemento = elem; temp->precedente = p->precedente; temp->successivo = p; p->precedente->successivo = temp; p->precedente = temp; p = temp; } template<class T> void lista<T>::canclista(posizione &p) { posizione temp = p; p->precedente->successivo = p->successivo; p->successivo->precedente = p->precedente; p = p->successivo; delete(temp); } template<class T> typename lista<T>::tipoelem lista<T>::leggilista(posizione p) { return(p->elemento); } template<class T> void lista<T>::scrivilista(posizione &p, tipoelem& elem) { p->elemento = elem; } template<class T> typename lista<T>::posizione lista<T>::predlista(posizione p) { return(p->precedente); } template<class T> typename lista<T>::posizione lista<T>::succlista(posizione p) { return(p->successivo); } template<class T> bool lista<T>::operator <(const char *str) { bool risultato = false; bool fine = false; int i = 0; do { cout << this.elemento[i] << "\t" << str[i] << "\n\n"; if(((int)this->elemento[i] < (int)str[i])) { risultato = true; fine = true; } else if((this.elemento[i] != '\0') && (str[i] == '\0')) fine = true; else i++; } while(((this.elemento[i] != '\0') && (str[i] != '\0')) && (fine == false)); return risultato; } template<class T> bool lista<T>::operator>(char *str) { bool risultato = false; bool flag = false; int i = 0; char *elementostr = this.elemento; while((this.elemento[i] != '\0') || (elementostr[i] != '\0') && (risultato == false)) { if((this.elemento[i] != '\0') && (elementostr[i] == '\0')) { risultato = true; flag = true; } else { if((this.elemento[i] == '\0') && (elementostr[i] != '\0')) flag = true; else i++; } } return(risultato); }
codice:#include <cstdlib> #include <iostream> #include "listap.h" using namespace std; int main(int argc, char *argv[]) { lista<char *> lis; lista<char *>::posizione p = lis.primolista(); char *parola1 = "ab"; char *parola2 = "aa"; lis.inslista(p, parola1); p = lis.succlista(p); lis.inslista(p, parola2); p = lis.primolista(); cout << lis.leggilista(p) << "\t"; cout << lis.leggilista(lis.succlista(p)) << "\n\n"; p = lis.primolista(); bool esito = (lis.leggilista(p) < lis.leggilista(lis.succlista(p))); cout << esito << "\n\n"; p = lis.primolista(); if(lis.leggilista(p) < lis.leggilista(lis.succlista(p))) cout << 1; else cout << 0; cout << "\n\n"; system("PAUSE"); return EXIT_SUCCESS; }

Rispondi quotando