Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2010
    Messaggi
    211

    C++ lista: metodo succlista

    ciao nell'implementazione delle liste ho implementato il metodo cucclista che restituisce l'indirizzo del nodo successivo a quello che viene passato come argomento. il codice è il seguente:

    codice:
    #include "listap.h"
    #include <iostream>
    #include <stdlib.h>
    
    using namespace std;
    
    int main()
    {
       listap<int> list;
       
       cout << list.listavuota() << "\n\n";
       
       cout << list.primolista() << "\n\n";
       
       listap<int>::posizione posi = list.primolista();
       cout << list.finelista(posi) << "\n\n";
       
       cout << list.leggilista(posi) << "\n\n";
       
       int el = 50;
       list.scrivilista(posi, el);
       cout << list.leggilista(posi) << "\n\n";
       
       cout << list.succlista(list.primolista()) << "\n\n";
       
       system("pause");
       return 0;
    }
    testlistap
    codice:
    #include "listap.h"
    #include <iostream>
    #include <stdlib.h>
    
    using namespace std;
    
    int main()
    {
       listap<int> list;
       
       cout << list.listavuota() << "\n\n";
       
       cout << list.primolista() << "\n\n";
       
       listap<int>::posizione posi = list.primolista();
       cout << list.finelista(posi) << "\n\n";
       
       cout << list.leggilista(posi) << "\n\n";
       
       int el = 50;
       list.scrivilista(posi, el);
       cout << list.leggilista(posi) << "\n\n";
       
       cout << list.succlista(list.primolista()) << "\n\n";
       
       system("pause");
       return 0;
    }
    quando compilo il testlista mi viene visualizzato il seguente messaggio di errore:

    [Linker error] undefined reference to `listap<int>::succlista(nodo<int>*)'
    ld returned 1 exit status

    dov'è l'anomalia???

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Non hai mostrato listap.h
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2010
    Messaggi
    211
    scusami, la posto subito.

    listap.h
    codice:
    #ifndef _listap_h
    #define _listap_h
    
    #include "nodo.h"
    #include <iostream>
    #include <stdlib.h>
    #include <stdio.h>
    
    using namespace std;
    
    template<class tipoelem>
    class listap
    {
       public:
          typedef nodo<tipoelem> *posizione;
               
          listap();      
          void crealista();
          bool listavuota();
          posizione primolista();
          bool finelista(posizione);
          tipoelem leggilista(posizione);
          void scrivilista(posizione, tipoelem);
          posizione succlista(posizione);
       private:
          nodo<tipoelem> cella;
    };
    
    #endif
    
    template<class tipoelem>
    listap<tipoelem>::listap()
    {
       crealista();
    }
    
    template<class tipoelem>
    void listap<tipoelem>::crealista()
    {
       cella.setprec(&cella);
       cella.setsuc(&cella);
       cella.setelem(0);
    }
    
    template<class tipoelem>
    bool listap<tipoelem>::listavuota()
    {
       return((cella.getprec() == &cella) && (cella.getsuc() == &cella));
    }
    
    template<class tipoelem>
    typename listap<tipoelem>::posizione listap<tipoelem>::primolista()
    {
       return(&cella);
    }
    
    template<class tipoelem>
    bool listap<tipoelem>::finelista(typename listap<tipoelem>::posizione pos)
    {
       return(pos->getsuc() == primolista());
    }
    
    template<class tipoelem>
    tipoelem listap<tipoelem>::leggilista(typename listap<tipoelem>::posizione pos)
    {
       return(pos->getelem());
    }
    
    template<class tipoelem>
    void listap<tipoelem>::scrivilista(typename listap<tipoelem>::posizione pos, tipoelem elem)
    {
       pos->setelem(elem);
    }
    
    template<class tipoelem>
    typename listap<tipoelem>::posizione succlista(typename listap<tipoelem>::posizione pos)
    {
       return(pos->getsuc());
    }

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Ci sarebbe anche nodo.h ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2010
    Messaggi
    211
    non credo sia determinate relativamente all'errore il codice di nodo.h, comunque lo posto subito.

    nodo.h
    codice:
    #ifndef _nodo_h
    #define _nodo_h
    
    #include <iostream>
    #include <stdlib.h>
    
    using namespace std;
    
    template<class T>
    class nodo
    {
       public:
          nodo();
          void setprec(nodo *);
          void setelem(T);
          void setsuc(nodo *);
          nodo *getprec();
          T getelem();
          nodo *getsuc();
       private:
          nodo *precedente;
          T elemento;
          nodo *successivo;
    };
    
    #endif
    
    template<class T>
    nodo<T>::nodo()
    {
       precedente = NULL;
       elemento = 0;
       successivo = NULL;
    }
    
    template<class T>
    void nodo<T>::setprec(nodo *prec)
    {
       precedente = prec;
    }
    
    template<class T>
    void nodo<T>::setelem(T elem)
    {
       elemento = elem;
    }
    
    template<class T>
    void nodo<T>::setsuc(nodo *succ)
    {
       successivo = succ;
    }
    
    template<class T>
    nodo<T>::nodo<T> *nodo<T>::getprec()
    {
       return(precedente);
    }
    
    template<class T>
    T nodo<T>::getelem()
    {
       return(elemento);
    }
    
    template<class T>
    nodo<T>::nodo<T> *nodo<T>::getsuc()
    {
       return(successivo);
    }

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Prova ad apportare le modifiche in rosso in

    nodo.h ...

    codice:
    template<class T>
    nodo<T> *nodo<T>::getprec()
    {
       return(precedente);
    }
    
    template<class T>
    nodo<T> *nodo<T>::getsuc()
    {
       return(successivo);
    }
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente di HTML.it
    Registrato dal
    Jan 2010
    Messaggi
    211
    niente, il problema resta.

  8. #8
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    59
    ciao!!

    la direttiva #endif va alla fine del file... è quello il problema quindi ti faccio un esempio

    codice:
    #ifndef _listap_h
    #define _listap_h
    
    #include "nodo.h"
    #include <iostream>
    #include <stdlib.h>
    #include <stdio.h>
    
    using namespace std;
    
    template<class tipoelem>
    class listap
    {
       public:
          typedef nodo<tipoelem> *posizione;
               
          listap();      
          void crealista();
          bool listavuota();
          posizione primolista();
          bool finelista(posizione);
          tipoelem leggilista(posizione);
          void scrivilista(posizione, tipoelem);
          posizione succlista(posizione);
       private:
          nodo<tipoelem> cella;
    };
    
    template<class tipoelem>
    listap<tipoelem>::listap()
    {
       crealista();
    }
    
    template<class tipoelem>
    void listap<tipoelem>::crealista()
    {
       cella.setprec(&cella);
       cella.setsuc(&cella);
       cella.setelem(0);
    }
    
    template<class tipoelem>
    bool listap<tipoelem>::listavuota()
    {
       return((cella.getprec() == &cella) && (cella.getsuc() == &cella));
    }
    
    template<class tipoelem>
    typename listap<tipoelem>::posizione listap<tipoelem>::primolista()
    {
       return(&cella);
    }
    
    template<class tipoelem>
    bool listap<tipoelem>::finelista(typename listap<tipoelem>::posizione pos)
    {
       return(pos->getsuc() == primolista());
    }
    
    template<class tipoelem>
    tipoelem listap<tipoelem>::leggilista(typename listap<tipoelem>::posizione pos)
    {
       return(pos->getelem());
    }
    
    template<class tipoelem>
    void listap<tipoelem>::scrivilista(typename listap<tipoelem>::posizione pos, tipoelem elem)
    {
       pos->setelem(elem);
    }
    
    template<class tipoelem>
    typename listap<tipoelem>::posizione listap<tipoelem>::succlista(typename listap<tipoelem>::posizione pos)
    {
       return(pos->getsuc());
    }
    
    #endif
    fai lo stesso in nodo.h.
    Inoltre dovevi modificare
    codice:
    template<class tipoelem>
    typename listap<tipoelem>::posizione succlista(typename listap<tipoelem>::posizione pos)
    {
       return(pos->getsuc());
    }
    in
    codice:
    template<class tipoelem>
    typename listap<tipoelem>::posizione listap<tipoelem>::succlista(typename listap<tipoelem>::posizione pos)
    {
       return(pos->getsuc());
    }
    ora dovrebbe andare...

    PS:
    Non ho controllato eventuali errori logici...

  9. #9
    Utente di HTML.it
    Registrato dal
    Jan 2010
    Messaggi
    211
    ma non credo sia un problema di #endif perchè sto testando un metodo alla volta appena finisco di implementarlo e con gli altri metodi non ho avuto questo problema. ho applicato il tuo suggerimento al metodo e mi dà sempre lo stesso problema.

  10. #10
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    59
    Guarda ora ho provato.
    Facendo le seguenti modifiche a me compila:

    listap.h
    codice:
    #ifndef _listap_h
    #define _listap_h
    
    #include "nodo.h"
    #include <iostream>
    #include <stdlib.h>
    #include <stdio.h>
    
    using namespace std;
    
    template<class tipoelem>
    class listap
    {
       public:
          typedef nodo<tipoelem> *posizione;
               
          listap();      
          void crealista();
          bool listavuota();
          posizione primolista();
          bool finelista(posizione);
          tipoelem leggilista(posizione);
          void scrivilista(posizione, tipoelem);
          posizione succlista(posizione);
       private:
          nodo<tipoelem> cella;
    };
    
    template<class tipoelem>
    listap<tipoelem>::listap()
    {
       crealista();
    }
    
    template<class tipoelem>
    void listap<tipoelem>::crealista()
    {
       cella.setprec(&cella);
       cella.setsuc(&cella);
       cella.setelem(0);
    }
    
    template<class tipoelem>
    bool listap<tipoelem>::listavuota()
    {
       return((cella.getprec() == &cella) && (cella.getsuc() == &cella));
    }
    
    template<class tipoelem>
    typename listap<tipoelem>::posizione listap<tipoelem>::primolista()
    {
       return(&cella);
    }
    
    template<class tipoelem>
    bool listap<tipoelem>::finelista(typename listap<tipoelem>::posizione pos)
    {
       return(pos->getsuc() == primolista());
    }
    
    template<class tipoelem>
    tipoelem listap<tipoelem>::leggilista(typename listap<tipoelem>::posizione pos)
    {
       return(pos->getelem());
    }
    
    template<class tipoelem>
    void listap<tipoelem>::scrivilista(typename listap<tipoelem>::posizione pos, tipoelem elem)
    {
       pos->setelem(elem);
    }
    
    template<class tipoelem>
    typename listap<tipoelem>::posizione listap<tipoelem>::succlista(typename listap<tipoelem>::posizione pos)
    {
       return(pos->getsuc());
    }
    
    
    #endif
    nodo.h
    codice:
    #ifndef _nodo_h
    #define _nodo_h
    
    #include <iostream>
    #include <stdlib.h>
    
    using namespace std;
    
    template<class T>
    class nodo
    {
       public:
          nodo();
          void setprec(nodo *);
          void setelem(T);
          void setsuc(nodo *);
          nodo *getprec();
          T getelem();
          nodo *getsuc();
       private:
          nodo *precedente;
          T elemento;
          nodo *successivo;
    };
    
    template<class T>
    nodo<T>::nodo()
    {
       precedente = NULL;
       elemento = 0;
       successivo = NULL;
    }
    
    template<class T>
    void nodo<T>::setprec(nodo *prec)
    {
       precedente = prec;
    }
    
    template<class T>
    void nodo<T>::setelem(T elem)
    {
       elemento = elem;
    }
    
    template<class T>
    void nodo<T>::setsuc(nodo *succ)
    {
       successivo = succ;
    }
    
    template<class T>
    nodo<T>* nodo<T>::getprec()
    {
       return(precedente);
    }
    
    template<class T>
    T nodo<T>::getelem()
    {
       return(elemento);
    }
    
    template<class T>
    nodo<T> *nodo<T>::getsuc()
    {
       return(successivo);
    }
    
    
    #endif


    main
    codice:
    #include "listap.h"
    #include <iostream>
    #include <stdlib.h>
    
    using namespace std;
    
    int main()
    {
       listap<int> list;
       
       cout << list.listavuota() << "\n\n";
       
       cout << list.primolista() << "\n\n";
       
       listap<int>::posizione posi = list.primolista();
       cout << list.finelista(posi) << "\n\n";
       
       cout << list.leggilista(posi) << "\n\n";
       
       int el = 50;
       list.scrivilista(posi, el);
       cout << list.leggilista(posi) << "\n\n";
       
       cout << list.succlista(list.primolista()) << "\n\n";
       
       system("pause");
       return 0;
    }
    prova un po' e fammi sapere...

    PS:

    Se stai usando il dev (prima di tutto ti consiglio di cambiarlo) dopo aver apportato le modifiche fai CTRL+F11, oppure clicca su esegui e nel menù che appare clicca su Riassembla tutto

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.