/* Lista Programma a cura di Vincenzo Capuano. I diritti sul programma sono riservati all'autore. Per informazioni: enzocap@interfree.it - www.sitoserio.it/cpp */ #include struct nodo { int x; nodo *link; }; class lista { void pop(nodo* &p,int x); void push(nodo* &p,int x); void canclista(nodo* &); void copia(nodo* p,nodo* &punt); void print(nodo* &p); nodo* coda(nodo* p); void add(nodo* &p,int x); void diff(nodo* &p,int x); void inversion(nodo* &p); public: nodo *testa; //puntatore alla struct nodo lista(); //costruttore ~lista(); //distruttore lista(const lista &ob); //costruttore di copie void insert(nodo* &p,int x); //inserimento in ordine void visual(); //funz. membro di output void cancella(); //cancella la lista attuale void canc_el(nodo* &p,int x);//cancella un elemento dalla lista void inverti(); //inverte una lista sul posto void cerca(nodo* &p,int x);//vede se un elemento e' presente nella lista void operator=(const lista &ob); //overloading op. di assegnamento lista operator+(const lista &ob); //fusione di due liste lista operator-(); //crea una copia della lista invertendola lista operator++(); //incrementa di 1 il valore degli elementi della lista friend lista operator+(const lista &ob,const int &x);//in tutti e due i casi friend lista operator+(const int &x,const lista &ob);//somma un valore agli el. friend lista operator-(const int &x,const lista &ob);//in tutti e due i casi friend lista operator-(const lista &ob,const int &x);//differenzia di un valore lista operator--();//decremento friend class iteratore;//iteratore }; //----------------------------------------------------------------------------- class iteratore{ lista *mine; //puntatore alla lista nodo *nodocorrente; //punt. al nodo corrente public: iteratore(lista &ob2);//costruttore iteratore void reset(); //riporta il punt. nodocorrente in testa alla lista int getnext();//resituisce l'elemento successivo }; iteratore::iteratore(lista &ob2):mine(&ob2) //con l'istruzione :mine(&ob2) si { //assegna all'attributo mine mine=&ob2; //l'indirizzo di ob2 } void iteratore::reset() { nodocorrente=mine->testa; } int iteratore::getnext() { int a; if(nodocorrente!=0) { a=nodocorrente->x; nodocorrente=nodocorrente->link; return a; } else return 0; } //----------------------------------------------------------------------------- lista::lista() { testa=NULL; } lista::~lista() { canclista(testa); } void lista::canclista(nodo* &p) { if(p) { canclista(p->link); delete p; p=NULL; } } lista::lista(const lista &ob) { copia(ob.testa,testa); } void lista::copia(nodo* p,nodo* &punt) { if(p) { punt=new nodo; punt->x=p->x; copia(p->link,punt->link); } else punt=NULL; } void lista::insert(nodo* &p,int x) { if(!p) push(p,x); else if(x<=p->x) push(p,x); else insert(p->link,x); } void lista::visual() { print(testa); } void lista::print(nodo* &p) { if(p) { cout<<"\n"<x<link); } } void lista::cancella() { canclista(testa); } void lista::canc_el(nodo* &p,int x) { if(p) { if(p->x==x) pop(p,x); canc_el(p->link,x); } } void lista::inverti() { inversion(testa); } void lista::inversion(nodo* &p) { nodo* q; if(p) if(p->link) { q=p; p=p->link; inversion(p); q->link->link=q; q->link=NULL; } } void lista::cerca(nodo* &p,int x) { if(!p) cout<<"\n l'elemento non c'e'!"; if(p) if(x==p->x) cout<<"\n l'elemento e' presente nella lista!"; else cerca(p->link,x); } void lista::operator=(const lista &ob) { canclista(testa); copia(ob.testa,testa); } lista lista::operator+(const lista &ob) { lista temp(ob); nodo* q=coda(temp.testa); if(q) copia(q->link,testa); else copia(q,testa); return temp; } nodo* lista::coda(nodo* p) { if(p) p=coda(p->link); return p; } lista lista::operator-() { lista temp; copia(testa,temp.testa); temp.inverti(); return temp; } lista lista::operator++() { add(testa,1); return *this; } void lista::add(nodo* &p,int x) { if(p) { p->x=p->x+x; add(p->link,x); } } void lista::diff(nodo* &p,int x) { if(p) { p->x=p->x-x; diff(p->link,x); } } lista operator+(const lista &ob,const int &x) { lista temp(ob); temp.add(temp.testa,x); return temp; } lista operator+(const int &x,const lista &ob) { lista temp(ob); temp.add(temp.testa,x); return temp; } lista operator-(const int &x,const lista &ob) { lista temp(ob); temp.diff(temp.testa,x); return temp; } lista operator-(const lista &ob,const int &x) { lista temp(ob); temp.diff(temp.testa,x); return temp; } lista lista::operator--() { diff(testa,1); return *this; } void lista::pop(nodo* &p,int x) { nodo *q; if(p) { x=p->x; q=p; p=p->link; delete q; } } void lista::push(nodo* &p,int x) { nodo *q; q=new nodo; q->x=x; q->link=p; p=q; } void main() { lista mylist,mylist2; int cont,scelta,item,rip,val; cont=1; cout<<"\n ***My List 3.0***"; cout<<"\n -by Enzo-\n"; while(cont) { cout<<"\n\n (*)Fai la tua scelta digitando il numero corrispondente:\n"; cout<<"\n -------------------OPZIONI----------------------------"; cout<<"\n dg 1 per inserire un elemento nella lista"; cout<<"\n dg 2 per visualizzare la lista"; cout<<"\n dg 3 per cercare un elemento"; cout<<"\n dg 4 per invertire la lista"; cout<<"\n dg 5 per fare una copia della lista"; cout<<"\n dg 6 per fondere due liste"; cout<<"\n dg 7 per incrementare di 1 il valore degli elementi"; cout<<"\n dg 8 per incrementare di un certo valore gli elementi"; cout<<"\n dg 9 per decrementare di 1 il valore degli elementi"; cout<<"\n dg 10 per decrementare di un certo valore gli elementi"; cout<<"\n dg 11 per cancellare un elemento della lista"; cout<<"\n dg 12 per cancellare tutta lista"; cout<<"\n dg 13 per scandire la lista con l'iteratore"; cout<<"\n dg 14 per uscire dal programma"; cout<<"\n ------------------------------------------------------"; cout<<"\n\n (*)Qual'e' la tua scelta? "; cin>>scelta; switch(scelta) { case 1: cout<<"\n -INSERIMENTO-"; cout<<"\n inserisci l'elemento: "; cin>>item; mylist.insert(mylist.testa,item); break; case 2: cout<<"\n -VISUALIZZAZIONE-"; mylist.visual(); break; case 3: cout<<"\n -CERCA-"; cout<<"\n inserisci l'elemento da cercare: "; cin>>val; mylist.cerca(mylist.testa,val); break; case 4: cout<<"\n -INVERSIONE-"; mylist2=-mylist; //si puņ scrivere anche mylist.inverti(); mylist2.visual(); break; case 5: cout<<"\n -COPIA LISTA-"; mylist2=mylist; mylist2.visual(); break; case 6: cout<<"\n -FUSIONE-"; mylist2=mylist; cout<<"\n\n -riempimento lista 2-"; do { cout<<"\n inserisci un valore: "; cin>>val; mylist2.insert(mylist2.testa,val); cout<<"\n Vuoi inserire un altro elemento?"; cout<<"\n (si=1,no=altro): "; cin>>rip; } while(rip==1); mylist=mylist+mylist2; cout<<"\n Per vedere se la fusione e' andata"; cout<<"\n a buon fine digita la scelta 2"; break; case 7: ++mylist; break; case 8: cout<<"\n Digita il valore da sommare agli elementi: "; cin>>val; mylist=mylist+val; //oppure mylist=val+mylist; break; case 9: --mylist; break; case 10:cout<<"\n Digita il valore da differenziare agli elementi: "; cin>>val; mylist=mylist-val; //oppure mylist=val-mylist; break; case 11:cout<<"\n Digita l'elemento da cancellare: "; cin>>val; mylist.canc_el(mylist.testa,val); break; case 12:mylist.cancella(); break; case 14:cont=0; case 13:cout<<"\n -SCANSIONE-"; iteratore iterlist(mylist); cout<<"\n -reset-"; iterlist.reset(); cout<<"\n -prelievo-"; cout<