// 1.3: Linked list
#include <iostream>
using namespace std;
class LList {
private:
int dato;
LList *next;
public:
// metodi di accesso
int get_dato() { return dato; };
void set_dato(int ndato) { dato = ndato; };
LList *get_next() { return next; };
void set_next(LList *nnext) { next = nnext; };
// costruttori e distruttore
LList()
: next(NULL), dato(0) { };
LList(int ndato)
: next(NULL), dato(ndato) { };
LList(LList *nnext, int ndato)
: next(nnext), dato(ndato) { };
};
// inserisci
LList *inserisci(LList *head, int dato) {
LList *nelement = new LList(head, dato); // alloca un nuovo elemento
return nelement;
}
// trova
LList *trova(LList *head, int dato) {
for(; head; head = head->get_next())
if(head->get_dato() == dato)
return head;
return NULL;
}
// cancella
LList *cancella(LList *head, LList *e) {
if(!head || !e)
return NULL;
LList *copyhead(head);
if(head == e) {
copyhead = head->get_next();
delete e;
} else {
for(; head; head = head->get_next())
if(head->get_next() == e) {
head->set_next(e->get_next());
delete e;
}
}
return copyhead;
}
// cancella
LList *cancella(LList *head, int dato) {
return cancella(head, trova(head, dato));
}
// stampa
void stampa(LList *head) {
for(; head; head = head->get_next())
cout << "Elemento @" << head << ": " << head->get_dato() << endl;
}
// main
int main() {
LList *head(NULL);
head = inserisci(head, 13);
head = inserisci(head, 581);
head = inserisci(head, 41);
head = inserisci(head, 222);
head = inserisci(head, 333);
stampa(head);
cout << "Cancello\n";
head = cancella(head, 333);
head = cancella(head, 41);
head = cancella(head, 13);
stampa(head);
}