Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1

    [C++] lista ordinata al contrario

    ciao a tutti,
    ho una classe lista e al suo interno ho definito anche il costruttore di copia e la ridefinizione dell'operatore assegnazione (=) in modo che facendo nel main C c1=c; si ottenga in c1 una copia dell'oggetto c. Ebbene, riesco ad ottenere una copia dell'oggetto c ma gli elementi della copia sono ordinati al contrario!

    Ecco la classe:
    codice:
    typedef int E;
    struct Record{
           E elem;
           Record* punt;
           };
    typedef Record* L;
    
    class lista{
          private:
          L l;
          void inserisciric(L& l, E e);
          void eliminaric(L& l, E e);
          void elimina_testa(L& l);
          public:
          lista(){ l=0;}
          lista(const lista &);
          lista& operator=(const lista & );
          ~lista();
          void copialista(const lista &);
          void push(E e);
          void pop(E e);
          void inserisci(E e){ inserisciric(l,e);}
          void elimina(E e){ inserisciric(l,e);}
          bool empty(){ return (l==0);}
          void top(E e);
          void print()const;
          };
    e l'implementazione della classe:

    codice:
    //costruttore di copia
    lista::lista(const lista& lista) {
      copialista(lista);
    }
    
    //ridefinizione operatore di assegnazione
    lista& lista::operator = (const lista& lista) {
        copialista(lista);
    }
    
    lista::~lista(){
               L q,p;
               for (p=l; p!=0; p=q){
                   q=p->punt;
                   delete p;
                  }
    }
    
    //funzione copia elemento per elemento, richiamata nel costruttore di copia
    void lista::copialista(const lista & lista){
    L q = lista.l;
         l = 0;
         while(q)
         {
           push(q->elem);
           q = q->punt;
         }
    }
    
    void lista::push(E e){
         L q=new Record;
         q->elem=e;
         q->punt=l;
         l=q;
    }
    
    void lista::print() const
    {
    L q = l;
    while (q!=0){
    cout << "Elemento: " << q->elem << " ";
    q = q->punt;
    } 
    }
    dove sbaglio???
    ciao!
    "Ogni artista è un cannibale, ogni poeta è un ladro
    tutti uccidono la loro ispirazione poi cantano del loro dolore "

  2. #2
    Ragiona, non vedi che la copi come uno stack?

  3. #3
    anche così ottengo lo stesso risultato:

    codice:
    void lista::copialista(const lista & lista){
    L q=lista.l ; //Creiamo un puntatore d'appoggio
    L t=lista.l;
           if (q!=0){        //Testiamo se la lista da copiare è vuota
                 l = new Record;   //Allochiamo una nuova struct
                 l->elem=q->elem;   //Copiamo i campi
                 //l->punt=l;
                 q=q->punt;  //Avanziamo col punt. nella lista da copiare
                 while(q!=0){  //Cicliamo fino a che non termina la lista
                     l->punt = q; //Accodiamo nuove struct
    
                     l->elem = q->elem;
                     l=l->punt;
                     q=q->punt;
                 }
           l->punt=0; //Poniamo il campo punt dell'ultima struct a zero
           }
           else cout<<"Lista Vuota";
    }
    "Ogni artista è un cannibale, ogni poeta è un ladro
    tutti uccidono la loro ispirazione poi cantano del loro dolore "

  4. #4
    Oddio che casino.. Ma poi non vedi che nell`ultimo codice crei un record solo? Non ti crasha? A me sembra un po` disordinato.. poi userei dei nomi/tipi un po` piu` indicativi per le variabili. Forse sono fissato io.

  5. #5
    Originariamente inviato da r0x
    Oddio che casino.. Ma poi non vedi che nell`ultimo codice crei un record solo? Non ti crasha? A me sembra un po` disordinato.. poi userei dei nomi/tipi un po` piu` indicativi per le variabili. Forse sono fissato io.
    idee??
    "Ogni artista è un cannibale, ogni poeta è un ladro
    tutti uccidono la loro ispirazione poi cantano del loro dolore "

  6. #6
    Hai ragione, ho solo criticato.

    codice:
    typedef Record* L;
    
    ...
    
    class lista{
          private:
          L l;
    Ecco, quelle L mi danno un ansia che non ti dico, quindi _distruggerei_ quel typedef e cambierei la variabile in:

    codice:
    	Record* head;	// testa della lista!
    Migliorerei poi leggerissimamente 'Record' cosi`:

    codice:
    struct Record
    {
    	Record( const E& _elem, Record* _punt = 0 ) : elem( _elem ), punt( _punt )
    	{
    	}
    
    	E elem;
    	Record* punt;
    };
    Un esempio di lista da copiare:

    A->B->C->D->0

    Dove 'head' punta ad A, okay? Lo scopo e` copiarla in 'this':

    codice:
    void lista::copialista( const lista& lista )
    {
    	svuota_lista(); // un`operazione che svuoti la lista corrente
    
    	Record** dst = &head;
    	Record* src = lista.head;
    
    	while( src )
    	{
    		*dst = new Record( src->elem );
    		dst = &( *dst )->punt;
    		src = src->punt;
    	}
    }
    Sembra contorto ma in realta` e` molto lineare. Dovrebbe andare!

  7. #7
    purtroppo non posso eliminare ne' il typedef ne'cambiare il nome delle variabili e dei prototipi in quanto la traccia dell'esercizio è molto rigida in tal senso...
    "Ogni artista è un cannibale, ogni poeta è un ladro
    tutti uccidono la loro ispirazione poi cantano del loro dolore "

  8. #8
    Ma dai! Non ci credo neanche se me lo fai leggere che non puoi cambiare i nomi dei tipi e delle variabili!

    Cmq riassestalo come vuoi tu e vedi se funziona, questo e` l`importante!

  9. #9
    ti giuro!!! i prototipi e alcune funzioni sono già fornite!
    "Ogni artista è un cannibale, ogni poeta è un ladro
    tutti uccidono la loro ispirazione poi cantano del loro dolore "

  10. #10
    Originariamente inviato da r0x
    Cmq riassestalo come vuoi tu e vedi se funziona, questo e` l`importante!
    allora, mantenendo la mia dichiarazione e il typedef:

    codice:
    void lista::copialista(const lista & lista){
    L tmp= l;
    L q = lista.l;
    
         while(q)
         {
           tmp=new Record(q->elem);
           tmp = &( *tmp )->punt;
           q = q->punt;
         }
    }
    putroppo non funziona
    48 listaclasse.cpp
    no matching function for call to `Record::Record (E &)'
    8 listaClasse.h
    candidates are: Record::Record(const Record &)
    8 listaClasse.h
    Record::Record()
    49 listaclasse.cpp
    base operand of `->' has non-pointer type `Record'

    ciao!
    "Ogni artista è un cannibale, ogni poeta è un ladro
    tutti uccidono la loro ispirazione poi cantano del loro dolore "

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.