Hola! lo que subiste no funciona xq
anterior siempre es igual a NULL, nunca entra al else; pero no esta del todo mal...
De todas formas el error principal esta en que no tenes claro el concepto de pasaje por valor y por pseudoreferencia. A la funcion vos le pasas el puntero
lst, es decir en la llamada haces
EliminarNodos(lst, maximo); // pasas por valor a lst
El problema es que si vos tratas asi a
lst cualquier modificacion que hagas en la funcion(es decir haces q apunte a otro lado) cuando retornes al main no va a tener efecto... Para resolver esto
tenes q pasar a lst por pseudoreferencia// en la llamada
EliminarNodos(&lst, maximo); // paso la direccion de lst
y en la funcion:
void EliminarNodos(NODO **lst, int maximo) // se trata como un puntero a puntero
{ }
Entonces, el codigo seria mas o menos asi:
void EliminarNodos(NODO **lst, int maximo){
NODO *indice=NULL, *anterior=NULL;
int flag;
if(*lst!=NULL){
indice=*lst;
while((indice)!=NULL){
flag=0;
if((indice->num)>=maximo){
if(indice==*lst){ // es decir es el inicio de la lista
*lst=indice->sig; // ahora el inicio de la lista es el siguiente
indice=*lst;
}else{ // no es el inicio
anterior->sig=indice->sig;
indice=anterior->sig;
}
flag=1;
}
if(!flag) { /* nose borran nodo */
anterior=indice;
indice=anterior->sig; /* cambia al sig nodo */
}
} /* fin del while */
}
}
Fijate q solo agregue un par de cosas a lo q tenias(ya q no estaba tan mal). Te falto considerar que pasa cuando indice->num>=maximo
es falso, el bucle se vuelve infinito ya que no cambias de nodo, te falto agregar
indice=anterior->sig; pero para q esto funcione bien agregue un flag. Cuando flag=0 es porque no se cumplio que num>=maximo(nose borran nodos) entonces se ejecuta
if(!flag) {
anterior=indice;
indice=anterior->sig; /* cambia al sig nodo */
}
de lo contrario flag=1 nose ejecuta lo anterior mencionada...
Si funciona lo que puse, analiza porque lo hice asi teniendo en cuenta todas las consideraciones. Saludos