PDA

Visualizza la versione completa : [C++] Funzione stampa a rovescio e unione di liste


italy07
20-06-2012, 10:32
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?

Scara95
20-06-2012, 12:53
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...

italy07
20-06-2012, 12:58
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)

italy07
20-06-2012, 15:49
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?

shodan
20-06-2012, 18:04
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 (http://en.wikipedia.org/wiki/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:



// in merge
if (this->firstptr == 0)
if(right.firstptr == 0)

etc.

italy07
20-06-2012, 20:33
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;
}
??????

shodan
20-06-2012, 20:58
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.

italy07
21-06-2012, 09:52
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?

italy07
25-06-2012, 11:51
nessuno mi aiuta?

italy07
25-06-2012, 14:20
il merge ci sono riuscito ma la stampa al roescio no :(

Loading