Buongiorno a tutti e buone feste passate. Sono uno studente del 4° informatico. Il nostro professore l'ultimo giorno di scuola in un'ora ha spiegato le liste concatenate in C++ e ci ha dato un esercizio per le vacanze natalizie: 
"Dopo aver creato una lista concatenata ordinata (in ordine crescente) di N numeri interi inseriti da tastiera, eliminare dalla lista tutti i numeri dispari e stampare poi il numero più piccolo e il numero più grande presenti nella lista."
Sono riuscito a fare la prima parte, ma nella seconda parte (quella di cancellare i numeri dispari) non capisco perchè me li 
cancella tutti. 
Probabilmente sarò linciato per l'algoritmo di cancellazione che sto per mettere, per quanto è fatto male, però aihmé sto cercando di imparare  
#include <iostream>
using namespace std;
 struct nodo
 {
   int numero;
   nodo* next;
 };
  // Prototipi
 void insOrdinato(nodo* &p, int x );
 void elimTesta(nodo* &p);
 void stampaLista(nodo *q );
 int menu();
//------------------------------- main ----------------------------------------
int main()
{
   // Puntatore di testa
   nodo* p = NULL;
   int scelta;
   int numero;
   int N;
   float resto;
   do
   {
     scelta = menu();
     switch( scelta )
     {
       case 1: cout<<"Quanti numeri vuoi inserire?"<<endl;
               cin>>N;
               for(int i=0; i<N; i++)
               {
                cout<<"Inserire n."<<i+1<<": ";
                cin>>numero;
                insOrdinato( p, numero );
               }
               break;
               
       case 2: cout<<"Sto elliminando i numeri dispari..."<<endl;
               elimTesta(p);
               break;
       case 3: stampaLista(p);
               break;
     }
   } while( scelta != 0 );
   return 0;
}
//--------------------------- menu ---------------------
int menu()
{
  int s;
  cout<<endl;
  cout<<"1) Inserimento numeri"<<endl;
  cout<<"2) Eliminazione numeri dispari"<<endl;
  cout<<"3) Stampa numero più piccolo e più grande"<<endl;
  cout<<"Scelta: ";
  cin>>s;
  return s;
}
//------------------------- insOrdinato ---------------------
void insOrdinato(nodo* &p, int x )
{
 // 1. Crea e inizializza il nuovo nodo
 nodo* q = new nodo;
 q->numero = x;
 q->next = NULL;
 // 2. Se la lista e' vuota oppure x e' minore del valore
 //    presente nel primo nodo, il nuovo nodo diventa il primo
 //    della lista
 if( p==NULL || (x < p->numero) )
 {
   q->next = p;
   p=q;
 }
 // 3. Altrimenti raggiungi il predecessore del nodo da inserire ...
 else
 {  nodo* r;
    // raggiungi il predecessore di q: nodo che ha come successore
    // un nodo che contiene un valore maggiore o uguale a x
    // oppure l'ultimo nodo della lista (se nessun nodo contiene
    // un valore maggiore o uguale a x)
    r=p;
    while( (r->next != NULL) && (x > r->next->numero) )
    {
       r=r->next ;
    }
    // aggancia il nuovo nodo
    q->next = r->next;
    r->next = q;
 }
}
//------------------------- elimTesta -------------------
void elimTesta(nodo* &p)
{
 float resto;
 for(int i=0;i<5;i++) {
  resto =  p->numero%2;
  if(resto != 0)
  {
   if(p != NULL)
   {
     nodo *q = p;
     p = p->next;
     delete q;
   }
  }
  else
  {
   p = p->next;
   }
                     }
 }
//------------------------- stampaLista -------------------
void stampaLista(nodo *q )
{
  // finche' q punta a un nodo (non siamo alla fine della lista)
  while( q != NULL )
  {
    // stampa l'numerormazione contenuta nel nodo
    cout << q->numero << endl;
    // sposta il puntatore q sul prossimo nodo.
    q = q->next;	
  }
}
Il ciclo for che è in elimina è perché inserisco sempre 5 numeri e faccio ripetere l'istruzione di eliminare per l'appunto 5 volte. 
Vi prego non mi aggredite per come è scritto il codice, sono 2 ore che provo, non ce la faccio più  . 
Grazie a chiunque mi aiuterà