PDA

Visualizza la versione completa : C++ lista: metodo succlista


pietrol83
22-10-2011, 16:19
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:



#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


#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???

oregon
22-10-2011, 16:28
Non hai mostrato listap.h

pietrol83
22-10-2011, 16:34
scusami, la posto subito.

listap.h


#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());
}

oregon
22-10-2011, 16:44
Ci sarebbe anche nodo.h ...

pietrol83
22-10-2011, 16:46
non credo sia determinate relativamente all'errore il codice di nodo.h, comunque lo posto subito.

nodo.h


#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);
}

oregon
22-10-2011, 17:00
Prova ad apportare le modifiche in rosso in

nodo.h ...




template<class T>
nodo<T> *nodo<T>::getprec()
{
return(precedente);
}

template<class T>
nodo<T> *nodo<T>::getsuc()
{
return(successivo);
}

pietrol83
22-10-2011, 17:08
niente, il problema resta.

premoli
22-10-2011, 17:31
ciao!!

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



#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


template<class tipoelem>
typename listap<tipoelem>::posizione succlista(typename listap<tipoelem>::posizione pos)
{
return(pos->getsuc());
}

in


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...

pietrol83
22-10-2011, 17:40
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.

premoli
22-10-2011, 17:58
Guarda ora ho provato.
Facendo le seguenti modifiche a me compila:

listap.h


#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


#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


#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

Loading