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
codice:
#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);
}
esercizio4
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;
}