/* 
   Scrivere una funzione che prende in ingresso una lista di interi
   e la modifica eliminando tutti gli elementi contenenti contenuto 
   informativo dispari.
   
   
   Esempio
   
   Se la lista di partenza contiene i valori:
   
       13 1 4 12 13 9 7 8 5 11
 
   dopo la chiamata della funzione dovra' contenere solo i seguenti valori:
   
        4 12 8
	  
*/   

#include <iostream>
using namespace std;

struct elem{
	int inf;
	elem* pun;	
};

void insTesta(elem* &p0, int a){
	elem *p = new elem;
	p->inf = a;
	p->pun = p0;
	p0 = p;	
}

void stampa(elem* p0){
   elem *p = p0;
   while( p != NULL){ 
      cout<<p->inf<<' ';
      p = p->pun;
  }
  cout<<endl;
}

void eliminaValoriDispari(elem* &p0){
   elem *p;
   while (( p0!=NULL ) && (p0->inf%2==1)){
	   p = p0;
	   p0 = p0->pun;
	   delete p;
   }
   for ( p = p0; p != NULL; p = p->pun){	   
      while ( (p->pun!=NULL) && (p->pun->inf%2==1) ){
         elem* q = p->pun;
         p->pun = p->pun->pun;
         delete q;	    	
      }	   
   }
	
}

int main(){
	
   elem* L = NULL;
  
   insTesta(L, 11);
   insTesta(L, 5);
   insTesta(L, 8);
   insTesta(L, 7);
   insTesta(L, 9);
   insTesta(L, 13);
   insTesta(L, 12);
   insTesta(L, 4);    
   insTesta(L, 1);
   insTesta(L, 13);
  
   cout<<"Contenuto della lista prima della eliminazione dei dispari:"<<endl;
   stampa(L);
  
   cout<<"Contenuto della lista dopo l'eliminazione dei dispari:"<<endl;
   eliminaValoriDispari(L);
   stampa(L);
  
   return 0;
   
}