Ho implementato la il tipo di dato lista concatenata in c++. Solo che in un metodo della classe Lista<T> mi da errore quando passo un indirizzo a nodo.
Mi spiego meglio
codice:
#ifndef NODO_H
#define NODO_H
#include <iostream>
using namespace std;
template <class T>
class Nodo{
public:
Nodo(){
info = 0;
ps = 0;
}
Nodo(const T& x,Nodo* p = NULL){
info = x;
ps = p;
}
Nodo(const Nodo& n){
info = n.info;
ps = n.ps;
}
void setInfo(const T& x){
info = x;
}
void setPs(const Nodo* &p){ //mi da errore con void setPs(const Nodo* &p)
ps = p;
}
T getInfo(){
return info;
}
Nodo* getPs(){
return ps;
}
private:
T info;
Nodo *ps;
};
#endif
Come potete vedere con setPs passo un indirizzo e lo passo per reference costante per prevenire modifiche.
codice:
//Lista.h
#include <iostream>
#include <assert.h>
#include "Nodo.h"
using namespace std;
template <class T>
class Lista{
public:
Lista();
Lista(const Lista&);
~Lista();
bool inserisciInTesta(const T&);
bool inserisciInCoda(const T&);
bool inserisciPostoI(const T&,int i);
bool rimuoviInTesta(T&);
bool rimuoviInCoda(T&);
bool rimuoviPostoI(T&);
T getInfoPostoI(int i);
int getDim();
private:
Nodo<T> *testa;
int dim;
};
template <class T>
bool Lista<T>::inserisciInTesta(const T& x){
Nodo<T> *nuovo;
nuovo = new (nothrow) Nodo<T>;
if(nuovo == NULL)
return false;
dim++;
nuovo->setInfo(x);
nuovo->setPs(testa);
testa = nuovo;
return true;
}
template <class T>
bool Lista<T>::inserisciInCoda(const T& x){
Nodo<T> *current = testa,*nuovo;
nuovo = new (nothrow) Nodo<T>;
if(nuovo == NULL)
return false;
nuovo->setInfo(x);
nuovo->setPs(NULL);
dim++;
if(testa == NULL){
testa = nuovo;
}
else{
while(current->getPs() != NULL)
current = current->getPs();
current->setPs(nuovo);
}
return true;
}
template <class T>
bool Lista<T>::inserisciPostoI(const T& x,int i){
Nodo<T> *current = testa,*nuovo;
if(i<=0 || i>dim)
return false;
nuovo = new (nothrow) Nodo<T>;
if(nuovo == NULL)
return false;
if(i==1){
inserisciInTesta(x);
}
else{
for(int j=1;j<i-1;j++){
current = current->getPs();
}
nuovo->setInfo(x);
nuovo->setPs(current->getPs());
current->setPs(nuovo);
dim++;
}
return true;
}
template <class T>
int Lista<T>::getDim(){
return dim;
}
template <class T>
Lista<T>::Lista(){
dim = 0;
testa = NULL;
}
template <class T>
Lista<T>::Lista(const Lista& x){
int dim = x.getDim();
Nodo<T> *n1 = x.testa;
Nodo<T> *nuovo,*current;
if(dim>=1){
nuovo = new Nodo;
nuovo->setInfo(x.testa->getInfo());
testa = nuovo;
current = nuovo;
n1 = n1->getPs();
for(int i=2;i<=dim;i++){
nuovo = new Nodo;
nuovo->setInfo(n1->getInfo());
current.setPs(nuovo);
current = nuovo;
n1 = n1->getPs();
}
current->setPs(NULL);
}
}
template <class T>
Lista<T>::~Lista(){
Nodo<T> *temp;
Nodo<T> *current = testa;
for(int i=1;i<=getDim();i++){
temp = current->getPs();
delete current;
current = temp;
}
}
e qui il compilatore mi da degli errori:
codice:
Errore 1 error C2664: 'Nodo<T>::setPs': impossibile convertire il parametro 1 da 'Nodo<T> *' a 'const Nodo<T> *&' d:\documents and settings\vincenzo\documenti\visual studio 2008\projects\pilallcpp\pilallcpp\lista.h 41 PilaLLCpp
Errore 2 error C2664: 'Nodo<T>::setPs': impossibile convertire il parametro 1 da 'int' a 'const Nodo<T> *&' d:\documents and settings\vincenzo\documenti\visual studio 2008\projects\pilallcpp\pilallcpp\lista.h 53 PilaLLCpp
Errore 3 error C2664: 'Nodo<T>::setPs': impossibile convertire il parametro 1 da 'Nodo<T> *' a 'const Nodo<T> *&' d:\documents and settings\vincenzo\documenti\visual studio 2008\projects\pilallcpp\pilallcpp\lista.h 61 PilaLLCpp
Errore 4 error C2664: 'Nodo<T>::setPs': impossibile convertire il parametro 1 da 'Nodo<T> *' a 'const Nodo<T> *&' d:\documents and settings\vincenzo\documenti\visual studio 2008\projects\pilallcpp\pilallcpp\lista.h 82 PilaLLCpp
Errore 5 error C2664: 'Nodo<T>::setPs': impossibile convertire il parametro 1 da 'Nodo<T> *' a 'const Nodo<T> *&' d:\documents and settings\vincenzo\documenti\visual studio 2008\projects\pilallcpp\pilallcpp\lista.h 83 PilaLLCpp
Che cavolo significa che non riesce a convertire un Nodo<T>* in un Nodo<T>*&?
Il secondo errore è dovuto al fatto che alla riga 53 gli passo NULL, ma non capisco perchè mi da errore...
codice:
//main
#include "Nodo.h"
#include "Lista.h"
#include <iostream>
using namespace std;
int main(){
Lista<int> l;
l.inserisciInTesta(2);
l.inserisciInTesta(4);
l.inserisciInCoda(20);
l.inserisciPostoI(52,2);
system("pause");
return 0;
}