Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2007
    Messaggi
    32

    [c++] problema lista

    codice:
    ho creato una lista con le classi e i template:
    file nodo.h:
    template<class T> class lista;
    template<class T>
    class nodo{
    friend class lista<T>;
    public:
    nodo(T &;
    T getdata();//restituisce i dati del nodo
    private:
    T data; //dati
    nodo<T> *nextptr; //nodo succ alla lista
    };
    //definizioni per la classe nodo
    template<class T>
    nodo<T>::nodo(T &info):data(info),nextptr(0){}
    
    template<class T>
    T nodo<T>::getdata(){
    return data;
    }#############################
    file lista.h:
    template<class T>
    class lista{
    public:
    lista();
    ~lista();
    bool isempty(){return firstptr==0;}
    bool isfull(){return false;}
    bool find(T &;
    void print();
    void printback();
    void top(){cout<<firstptr->data;} //top pila,coda
    void elimina(T &;//elimina un elemento dato
    void instop(T &; //push pila
    void insback(T &;//push coda
    bool deltop(T &; //pop pila
    bool delback(T &;//pop coda
    void insord(T &;
    lista<T> operator+ (lista<T>&;
    
    private:
    nodo<T> *firstptr;
    nodo<T> *lastptr;
    nodo<T> *getnew(T &;//alloca un nuovo nodo
    };
    
    
    qualcuno sa dirmi come fare una funzione stampa al rovescio, e unisci due liste?

  2. #2
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    Come farlo è semplice da capire, lo stesso nome della funzione ti dice come farlo, prova tu a scrivere il codice e poi noi te lo correggiamo...
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2007
    Messaggi
    32
    il problema e che io ho sempre usato una lista fatta nel modo piu semplice con una struct per il nodo e senza template.

    qui non so muovermi

    ad esempio dovrei fare una cosa del genere?
    template <class T>
    lista<T> lista<T>::merge(lista<T>& right)

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2007
    Messaggi
    32
    oppure una cosa del genere:
    list * concatenate(list * l1, list * l2)
    {
    list * f = NULL;
    list * n = NULL;

    if(l1 == NULL)
    f = l2;
    else if(l2 == NULL)
    f = l1;
    else
    {
    n = l1;
    f = n;
    while(n->next != NULL)
    n = n->next;
    n->next = l2;
    }

    return f;
    }

    il problema e come si fa con classi e template?

  5. #5
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Originariamente inviato da italy07
    il problema e che io ho sempre usato una lista fatta nel modo piu semplice con una struct per il nodo e senza template.

    qui non so muovermi

    ad esempio dovrei fare una cosa del genere?
    template <class T>
    lista<T> lista<T>::merge(lista<T>& right)
    Si. Quando si definisce un template, il parametro va sempre specificato; inoltre la definizione non può risiedere in un file.cpp, ma solo nell'header. E' necessario anche inline per non violare la one definition rule

    Comunque la funzione qui sopra è sbagliata: merge non è membro di lista<T> per cui avrai un errore di compilazione. Se decidi di renderla membro di lista<T>, poi potrai accedere ai campi interni di entrambi i parametri (il sottinteso *this e right). Ad esempio:

    codice:
    // in merge 
    if (this->firstptr == 0)
    if(right.firstptr == 0)
    etc.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2007
    Messaggi
    32
    finalmente uno che mi risponde
    cmq si i template funzionano solo nel header. Per quanto rigurada la funzione non ho capito bene, ok inserisco la funzione nella classe lista:
    lista merge(lista<T>);

    poi non capisco dove devo usare this..
    if(this->firstptr == NULL)
    f = right.firstptr;
    else if(right.firstptr == NULL)
    f = this->firstptr;
    else
    {
    n = this->firstptr;
    f = n;
    while(n->next != NULL)
    n = n->next;
    n->next = right.firstptr;
    }

    return f;
    }
    ??????

  7. #7
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    this è solo un segnaposto (c'è chi lo omette e chi no) per identificare l'oggetto sottinteso nella funzione membro. Per capirsi: la tua funzione riceve un parametro right (e fai right.firstptr), ma l'altro firstptr chi ce lo mette?
    Risposta: this. E poiché this è sempre un puntatore usi -> per accedere al dato.
    Dato poi che this all'interno di una funzione membro è pleonastico in genere si omette, per cui rimane solo firstptr (ho messo this solo per comodità in modo da capire l'oggetto destinazione).

    Venendo alla funzione.
    Hai tre casi per il merge:
    1) this->firstptr == NULL => la funzione decade in una copia di right in this;
    2) right.firstptr == NULL => manca ciò che devi unire, ritorni this (*this in realtà).
    3) this->firstptr != NULL && right.firstptr != NULL => qui devi decidere cosa fare: semplice concatenazione? Un incastro di elementi uno si e uno? Due si e uno no?
    E ricorda che non devi copiare i puntatori, ma ciò a cui puntano.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  8. #8
    Utente di HTML.it
    Registrato dal
    Sep 2007
    Messaggi
    32
    ho capito che quando uso firstptr è sottonintesto(this->fistrptr) mentre per l'altra lista right devo usare right.firstptr.
    puoi farmi vedere come andrebbe fatta bene questa funzione?

  9. #9
    Utente di HTML.it
    Registrato dal
    Sep 2007
    Messaggi
    32
    nessuno mi aiuta?

  10. #10
    Utente di HTML.it
    Registrato dal
    Sep 2007
    Messaggi
    32
    il merge ci sono riuscito ma la stampa al roescio no

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