Allora, supponi di avere una struttura del genere

codice:
// definisco puntatore a struttura nodo
typedef pnode *struct node

// definisco struttura nodo
struct node {
     int info;
     pnode next;
}
A questo punto la soluzione iterativa è immediata

codice:
// Funzione iterativa per la ricerca del primo pari
// Passo la testa della lista già caricata
pnode trovaPrimoPari(pnode lista) {

     // dichiaro una lista temporanea per scorrere
     // la lista in input
     pnode i; 

     // scorro la lista
     for(i=lista; i!=NULL; i=i->next) {

          // verifico che l'elemento trovato sia pari
          // ovvero se la divisione per 2 ha come resto 0
          if(i->info%2==0) {
               
               // Ritorno il nodo che contiene tale numero
               return i;
          }
     }

     // Se arrivo qui non ho trovato il numero pari
     // quindi ritorno NULL
     return NULL;
}
La soluzione ricorsiva è immediata

codice:
// Funzione ricorsivaper la ricerca del primo pari
// Passo l'iesimo nodo della lista già caricata
// La prima volta passo la testa
pnode trovaPrimoPariRic(pnode lista) {

     // Caso Base 1: lista vuota
     if(lista==NULL) {

          // Nono ho trovato il numero pari
          return NULL;
     }

     // Caso Base 2: trovo il primo numero pari
     if(lista->info%2==0) {

          // Ho trovato il numero pari
          // Ritorno il nodo che contiene il primo
          // numero pari
          return lista;
     }

     // Se arrivo qui eseguo ricorsione
     // sul resto della lista
     return trovaPrimoPariRic(lista->next);
}
Capito???