Visualizzazione dei risultati da 1 a 8 su 8

Discussione: [C++] Unire due liste

  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    30

    [C++] Unire due liste

    Salve volevo chiedervi una cosa...
    Vorrei unire due liste di dati, ma mi da un errore.
    Partiamo dalla seguente struttura semplificata (metto quello che serve):

    file.h
    codice:
    struct nodo
    {
       int valore;
       nodo *succ;
    };
    
    class lista
    {
    private:
      nodo *l;
    public:
      lista(){l=0;}   //Costruttore
      ~lista();       //Distruttore
    
    };
    Supponiamo che voglia definire due liste nel main.cpp , quindi:
    codice:
    lista l1;
    lista l2;
    Ora voglio unire le due liste (che hanno un numero "x" di elementi), tramite l'overloading dell'operatore "+".
    Quindi scriverò nel file.h:

    codice:
    struct nodo
    {
       int valore;
       nodo *succ;
    };
    
    class lista
    {
    Private:
      nodo *l;
    public:
      lista(){l=0;}   //Costruttore
      ~lista();       //Distruttore
    
      nodo* operator+(nodo* l1,nodo* l2);
    };
    E nel sottoprogramma file.cpp:

    codice:
    nodo* lista::operator+(nodo* l1,nodo* l2){
        nodo* t;
        t=l2;
        if(l2==NULL)
            return l1;
        else if(l1==NULL)
            return l2;
        else
        while(l2->succ!=NULL){
            l2=l2->succ;
        };
        l2->succ=l1;
        l2=t;
    
        return l2;
    };
    Ora però compilando mi da il seguente errore:
    In file included from contatore.cpp:4:
    contatore.h:26: error: `nodo* lista:perator+(nodo*, nodo*)' must take either zero or one argument
    contatore.cpp:207: error: `nodo* lista:perator+(nodo*, nodo*)' must take either zero or one argument
    La cosa strana, è che in un'esercizio simile, ho usato la sintassi :
    codice:
     struct Complex {
        float Re;
        float Im;
      };
    
      Complex operator+(const Complex& A, const Complex& B) {
        Complex Result;
        Result.Re = A.Re + B.Re;
        Result.Im = A.Im + B.Im;
        return Result;
      }
    E sembrava funzionare.
    Quale può essere il problema?
    Cioè , vorrei passargli le due liste, e poi unirle.
    O provato a cercare, ma non ho trovato risposte (anche su siti inglesi).
    Forse l'errore sarà stupido, ma non riesco a vederlo....

    Se qualcuno riesce a darmi una risposta, lo ringrazio in anticipo.

  2. #2
    Utente di HTML.it L'avatar di KrOW
    Registrato dal
    Feb 2009
    Messaggi
    281
    Ciao ... Siccome l' overloading dell' operatore + (nella classe lista) è un metodo della classe, il parametro da passare al metodo è solo uno (perchè un' operando è sottointeso e nascosto grazie al puntatore this) cosa che non avviene in Complex (che è una funzione esterna alla classe e quindi non fa uso del puntatore this) ... Comunque non mi sembra che l' implementazione dell' overloading sia corretta ...
    C++ 4ever
    496e2062696e6172696f206e6f6e2063692061767265737469 206e656d6d656e6f2020726f7661746f203a29

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    30
    Ciao ... Siccome l' overloading dell' operatore + (nella classe lista) è un metodo della classe, il parametro da passare al metodo è solo uno (perchè un' operando è sottointeso e nascosto grazie al puntatore this) cosa che non avviene in Complex (che è una funzione esterna alla classe e quindi non fa uso del puntatore this) ... Comunque non mi sembra che l' implementazione dell' overloading sia corretta ..
    Tecnicamente forse ho capito, ma praticamente mi resta difficile pensare a come prendere l'ultimo elemento della prima lista e collegarlo al primo della seconda....

    Cioè , se io scrivessi in chiamata (main.cpp):
    codice:
    lista l1,l3,l4;
    l4=l1+l3;

    In file.h :

    codice:
    struct nodo
    {
       int valore;
       nodo *succ;
    };
    
    class lista
    {
    private:
      nodo *l;
    
    public:
      lista(){l=0;}   //Costruttore
      ~lista();       //Distruttore
      lista operator+(lista l1);
    };
    Cioè in questo caso, come farei ad eseguire la stessa cosa qui dentro(con i puntatori a nodo)?

    file.cpp
    codice:
    lista lista::operator+(lista l1){
    
    /* cioè a questo punto non riesco a capire come scrivere le stesse cose*/
    /* ho provato, si compila, ma poi mi escono una serie di asterischi*/
    
    };
    Qualche idea su una possibile implementazione(da qualcuno un po più bravo di me, purtroppo da autodidatta non riesco a fare molto di più)?

  4. #4
    Utente di HTML.it L'avatar di KrOW
    Registrato dal
    Feb 2009
    Messaggi
    281
    Tieni a mente che nell' unione le due liste (almeno per mantenere un pò di coerenza con gli operatori) non dovrebbero essere modificate cioè:
    codice:
    lista l1, l2;
    // Immagazzinamento dati liste;
    lista l3 = l1 + l2;
    Qui l3 viene modificato (in questo caso anche inizializzato) ma l1 e l2 no. Quindi l' overload dell' operatore + dovrebbe prendere come input le due liste da unire e restituire una nuova lista (l' unione tra le due d' input) ... Ovvero:
    codice:
    lista lista::operator+ ( const lista& left )
    {
    lista unionList;
    /* Copia i dati della prima lista */
    nodo currNode = l;
    while( currNode != NULL )
    {
    unionList.AddNode(currNode->valore );
    currNode = currNode->succ;
    }
    /* Copia i dati della seconda lista */
    currNode = left.l;
    while( currNode != NULL )
    {
    unionList.AddNode( currNode->valore );
    currNode = currNode->succ;
    }
    return unionList;
    }
    Nota che in questo codice ho fatto assunzione che ci sia un metodo AddNode il cui scopo dovrebbe essere semplice da capire (e anche la presenza di un costruttore di copia appropriato) ...
    EDIT : SCUSA PER LE CONTINUE MODIFICHE
    C++ 4ever
    496e2062696e6172696f206e6f6e2063692061767265737469 206e656d6d656e6f2020726f7661746f203a29

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    30
    Ho giusto qualche altra cosa da chiederti (ti ringrazio per la spiegazione):

    codice:
    nodo currNode = l;
    1)Non dovrebbe essere?

    codice:
    nodo* currNode = l;
    E' un errore di battitura o sbaglio io?

    2)AddNode è una funzione di inserimento di un nuovo valore?
    E la utilizzo per inserire nella nuova lista chiamata "unionList", uno per volta gli elementi puntati da "currNOde" giusto?

    Poi si fa lo stesso con gli elementi dell'altra lista (quella di sinistra ipotizzo), dato che è stata chiamata left.

    E alla fine si restituisce l'unione.

    Se corretto basta un si , altrimenti ho capito male il codice.

    4)E quindi è vero che: per l'elemento a destra (il mio l2) si può accedere tramite la lettera "l", per l'elemeto a sinistra c'è bisogno di specificare anche il nome, cioè "left.l" (il mio l1)?
    O comunque una cosa del genere, o ho capito male?

  6. #6
    Utente di HTML.it L'avatar di KrOW
    Registrato dal
    Feb 2009
    Messaggi
    281
    1) si è un mio errore
    2) si solo che ho sbagliato (ma va) il nome del parametro (dovrebbe essere right infatti si riferisce all' operando destro) che comunque è ininfluente
    4) dovresti saperlo se sei arrivato alle classi
    C++ 4ever
    496e2062696e6172696f206e6f6e2063692061767265737469 206e656d6d656e6f2020726f7661746f203a29

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2009
    Messaggi
    30
    Thx, le cose le ho capite dal tuo codice (ho chiesto degli errori, era per essere sicuro, dato che non ho moltissima esperienza).
    Comunque sei stato molto chiaro, ti ringrazio di tutto .

  8. #8
    Utente di HTML.it L'avatar di KrOW
    Registrato dal
    Feb 2009
    Messaggi
    281
    Prego non c' è di che ...
    C++ 4ever
    496e2062696e6172696f206e6f6e2063692061767265737469 206e656d6d656e6f2020726f7661746f203a29

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 © 2025 vBulletin Solutions, Inc. All rights reserved.