Ok, allora, il problema è cambiato. Mi è stato detto che questa funzione ha un costo decisamente alto, effettivamente ci sono while ovunque, ma era l'unico modo in cui ero riuscito a risolvere.

Mi è stato detto di eliminare gli elementi oltre la soglia usando un unico ciclo
codice:
    while ( (*lista)->next != NULL ){        struct elemento *tmp;
        tmp=*lista;
        *lista=(*lista)->next;
        free(tmp);
    }
Ora, l'unico problema è che ciò non fa puntare a NULL il campo lista->next dell'ultimo elemento valido (l'ultimo elemento prima di quelli che verranno eliminati), ma dopo il ciclo punta ad un'area di memoria a cui è stato fatto free.

Come potrei fare?