Avresti potuto anche postare un po' di contesto...
In ogni caso nel tuo codice mancano dei controlli su alcuni casi NULL, il malloc all'inizio è inutile (ed anzi causa un memory leak), la logica è sovracomplicata...
codice:
#include <stdio.h>
#include <stdlib.h>
 
typedef struct El {
    int i;
    struct El *next;
} Elemento;
 
typedef Elemento *Lista;
 
void Dis(Lista *lista) {
  Lista tmp = *lista;
  Lista tmp1;
  while((tmp != NULL) && (tmp->i % 2 == 0)) {
    tmp1 = tmp;
    tmp = tmp->next;
    free(tmp1);
  }
  *lista = tmp;
  while(tmp) {
    if((tmp->next) && (tmp->next->i % 2 == 0)) {
      tmp1 = tmp->next;
      tmp->next = tmp->next->next;
      free(tmp1);
    }
    tmp = tmp->next;
  }
}
 
int main() {
    Lista l = NULL, tmp;
    int i;
    for(i = 9; i > 0; i--) {
        tmp = (Lista)malloc(sizeof(Elemento));
        tmp->next = l;
        tmp->i = i;
        l = tmp;
    }
    Dis(&l);
    while(l) {
        printf("%d,", l->i);
        tmp = l;
        l = l->next;
        free(tmp);
    }
    return 0;
}
Qui puoi vedere un esempio completo compreso, compreso il main usato per il test e, soprattutto, le strutture dati che vanno sempre postate