Piccolo problema con le liste..

slevyn
Salve , ho un piccolo problema con una lista...Una volta che visualizzo a video i valori che ho inserito , mi visualizza SOLO l'ultimo elemento inserito tante volte quanti sono gli elementi della lista.
                                                                                                 
typedef char* tipoelem;
typedef class cella * posizione;

class cella
{
    public:
    cella();
    bool operator<(cella &);
    void setElemento(tipoelem);
    tipoelem getElemento() const;
    void setSucc(posizione);
    void setPrec(posizione);
    posizione getSucc() const;
    posizione getPrec() const;
    private:
    tipoelem etichetta;
    posizione successivo;
    posizione precedente;
};



cella::cella() { precedente = successivo = NULL ;
                  etichetta = ""; } ;

void cella::setElemento(tipoelem a)
{
    etichetta = a;
}


tipoelem cella::getElemento() const
{
    return etichetta;
}


void cella::setPrec(posizione p)
{
    precedente = p;
}


posizione cella::getPrec() const
{
    return precedente;
}


void cella::setSucc(posizione p)
{
    successivo = p;
}


posizione cella::getSucc() const
{
    return successivo;
}


bool cella::operator<(cella & C2)
{
    if ( getElemento() < C2.getElemento() )
    return true;
    else return false;
}



class lista
{
    public:
    lista();
    void creaLista();
    bool listaVuota();
    bool fineLista(posizione) const;
    tipoelem leggiLista(posizione) const;
    void scriviLista(tipoelem,posizione);
    posizione primoLista() const;
    posizione succLista(posizione) const;
    posizione predLista(posizione) const;
    void insLista(tipoelem , posizione & );
    void cancLista(posizione &);
    private:
    posizione LISTA;
};



lista::lista() { creaLista();}


void lista::creaLista()
{
    LISTA = new cella;
    LISTA->setElemento(NULL);
    LISTA->setPrec(LISTA);
    LISTA->setSucc(LISTA);
}


bool lista::listaVuota()
{
    if ( (LISTA->getSucc()== LISTA) && (LISTA->getPrec()== LISTA ))
    return true;
    else return false;
}


bool lista::fineLista(posizione p) const
{
    return ( p == LISTA );
}


tipoelem lista::leggiLista(posizione p) const
{
    return p->getElemento();
}

void lista::scriviLista(tipoelem a , posizione p)
{
    p->setElemento(a);
}


posizione lista::primoLista() const
{
    return LISTA->getSucc();
}


posizione lista::succLista(posizione p) const
{
    return p->getSucc();
}

posizione lista::predLista(posizione p) const
{
    return p->getPrec();
}


void lista::insLista(tipoelem a , posizione & p )
{
    posizione temp;
    temp = new cella;
    temp->setElemento(a);
    temp->setPrec(p->getPrec());
    temp->setSucc(p);
    (p->getPrec())->setSucc(temp);
     p->setPrec(temp);
     p = temp;
}

void lista::cancLista(posizione & p)
{
    posizione temp;
    temp = p ;
    (p->getSucc())-> setPrec(p->getPrec());
     (p->getPrec()) -> setPrec(p->getSucc());
     p = p -> getSucc();
     delete(temp);
}


Invece questo sono i metodo per inserire e visualizzare i valori :
void immissioneValori(lista & L)
{
   posizione p;
    bool flag = false;
    char risposta ;
    tipoelem el = new char[20];

    p = L.primoLista();
    cout<<"\n";
    cout<<"Inserire elemento nella lista : ";
    cin>>el;
    L.insLista(el,p);
    cout<<"\nVuoi inserire un altro elemento ( s/n ) ? ";
    fflush(stdin);
    cin>>risposta;
    if( risposta == 's' ) {
       flag = true;
       p= L.succLista(p);
         while(flag){
                  cout<<"Inserire elemento nella lista : ";
                  fflush(stdin);
                     cin>>el;
                       L.insLista(el,p);
                         cout<<"\nVuoi inserire un altro elemento ( s/n ) ? ";
                         fflush(stdin);
                          cin>>risposta;
                       if( risposta == 's') {
                         flag = true;
                         p =L.succLista(p);
                       }
                         else flag = false;
                   }
           }
}



void printLista(lista L)
{
posizione pos;
cout << "Gli elementi della lista sono:";
pos = L.primoLista();
while(!L.fineLista(pos))
{
cout << "\n["<<pos->getElemento()<<"]";
pos=L.succLista(pos);
}
if (L.fineLista(pos)) cout <<"\nLa lista e' terminata\n";
}


Risposte
apatriarca
posti di nuovo tutto il codice così posso provarlo quando ho tempo e provo a studiarlo meglio?

slevyn
L'ho postato tutto in prima pagina ..le due classi : cella e lista ..e le relative implementazioni dei metodi

apatriarca
Sì, intendo dire il codice dei metodi che non funzionano. I due metodi di visualizzazione e di eliminazione non erano infatti ancora implementati e non hai mostrato l'ultima versione in cui seguivi il mio suggerimento di cambiare il tipo del parametro della funzione.

slevyn
La funzione di immissione dei valori nella lista è corretta. Per quanto riguarda la visualizzazione , ho sovraccaricato l'operatore cout , e anch'esso funziona dopo una normale immissione di valori .

/* SOVRACCARICO OPERATORE  COUT */
template<class T>
ostream& operator<<(ostream & out , const lista<T> & l )
{
	cella<T>* p = l.primoLista();
	cout << "[";
	while (!l.fineLista(p)){
		if (p != l.primoLista())
			cout << ", " << l.leggiLista(p);
		else
			cout << l.leggiLista(p);
		p = l.succLista(p);
	}
	cout << "]" << endl;
	return out;
}


/* FUNZIONE DI ORDINAMENTO 
template<class T> void ordina(lista<T> & L)
{
//ordina i nodi di una lista in modo crescente (insert sort)

     cella<T> *min = L.primoLista();
     cella<T> * p2 = L.primoLista();
     cella<T> * p= L.primoLista();



           for(p = L.primoLista(); p != NULL ; p = L.succLista(p)) {
              for(p2=p, min=p2; p2 != NULL; p2=L.succLista(p2))  {
                  if(  L.leggiLista(p2)<L.leggiLista(min)  ) {
                     cella<T>* temp = min->getSucc();
                       min->setSucc(p2->getSucc());
                         p2->setSucc(temp);
                           temp = min->getPrec();
                              min->setPrec(p2->getPrec());
                                p2->setPrec(temp);
                                  min = p2;
                  }
              }
           }
}


Il mio main è questo , dopo il cout di M non succede più nulla :/
int main()
{    lista<string> M; 
     immissioneValori(M);
     cout<<M;   /
     ordina(M);
     cout<<M;
}


slevyn
Ecco sono riuscito ad implementare questo algoritmo basato sul selection sort....l'algortimo funge solo parzialmente ..e mi stampa la lista ordinata parzialmente... cosa c'è che non va ?

template<class T> void ordina(lista<T> & L)
{
//ordina i nodi di una lista in modo crescente (insert sort)

     cella<T> *min;
     cella<T> * p = L.primoLista();
     cella<T> * p2= L.succLista(p);
      
     
       while(!L.fineLista(p)) {
                 min = p;
            while(!L.fineLista(p2)) {
                   if( L.leggiLista(p2)<L.leggiLista(min)) {
                            T temp1 = L.leggiLista(p2);
                              T temp2 = L.leggiLista(min);
                                L.scriviLista(temp1,min);
                                   L.scriviLista(temp2,p2);
                   }
                   p2=L.succLista(p2);
            }
            p=L.succLista(p);
       }
    }
         

slevyn
ecco finalmente sono riuscito a far funzionare l'algoritmo...l'unico problema è che funziona solo PER DATI NUMERICI ( float,int,double)...appena instanzio una lista di char o string..mi effettua uno strano ordinamento

ESEMPIO
inserisco : A,Z , B , M

e dopo l'ordinamento ricevo : A,B,B,M o______________o

template<class T> void ordina(lista<T> & L)
{
// UTILIZZO DELL'ALGORITMO DI SELECTION SORT PER ORDINARE I NODI DELLA LISTA

     cella<T> *min;
     cella<T> *p ;
     cella<T> *p2;
      T minimo ;


      for(p=L.primoLista(); !L.fineLista(p); p=L.succLista(p)){
           for( minimo = L.leggiLista(p) , min=p , p2=L.succLista(p) ; !L.fineLista(p2) ; p2=L.succLista(p2)){
                  if( L.leggiLista(p2)< minimo) {
                         minimo = L.leggiLista(p2);
                         min = p2;
                  }
                     if(min!=p) {
                         L.scriviLista(L.leggiLista(p),min);
                         L.scriviLista(minimo,p);
                    }
              }
      }
}



per favore qualcuno mi risponda...sto parlando da solo....

apatriarca
Scusa se non ti ho più risposto, ma non ho avuto tempo di provare il codice. Appena ho tempo (non so se prima di domani sera), vedo di darti una risposta più esauriente. Una prima cosa che noto è che il seguente if dovrebbe stare secondo me al di fuori del ciclo per la ricerca del minimo:
if(min!=p) {
    L.scriviLista(L.leggiLista(p),min);
    L.scriviLista(minimo,p);
}

slevyn
Ho provato ad apportare questa modifica .
in input immetto : A,Z,M,R
output : A,Z,M,
Comunque penso non vada modificato niente dato che per i dati numerici l'algoritmo funziona perfettamente...voglio capire perchè non funziona per i char e per le string

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.