Ok fue culpa mia, omiti el puntero UltimNode cuando te plantee la funcion 'eliminarNode': en la condicion de eliminar nodo diferente del primero, solo debes asignar a la global UltimNode la referencia al nodo previo al que vas a borrar en el caso que vayas a borrar el ultimo elemento de la lista (esto incluye el caso de un unico elemento)
Código:
void eliminarNode(char *dominio) {
NodeDNS *cur, *pre;
cur = PrimerNode;
pre = NULL;
while(cur) {//cicle
if(!strcmp(cur->nombre, dominio)) {//troba objectiu
if(!pre) {//objectiu == primer node
PrimerNode = cur->DNSseguent;
}
else {//objectiu != primer node
pre->DNSseguent = cur->DNSseguent;
}
//node objectiu es l'ultim de la llista?
//independentment de si es el primer o no
if(!strcmp(cur->nombre, UltimNode->nombre)) {
UltimNode = pre;
}
//allibera
free(cur);
//surt del cicle
break;
}
//iteracio
pre = cur;
cur = cur->DNSseguent;
}
}
Ten en cuenta que los punteros al ultimo nodo de una lista solo son utiles cuando trabajas con listas doblemente enlazadas (dentro del struct tendrias dos punteros: uno al nodo siguiente y otro al anterior) y sirve para acelerar las busquedas; en este caso el puntero al ultimo nodo solo sirve para acelerar la adicion de un nodo al final de la lista.
Otra cosa, tienes algun error de concepto, te los comento:
La funcion de entrada a la aplicacion es de tipo entero, debes declararla como tal y retornar un valor entero (por defecto se usa 0 si todo ok, o un valor diferente de 0 como indice de error en caso que se produjera alguno)
Código:
int main() {
...
return 0;
}
Lo de asignar el valor nulo a los punteros nulos, antes de comenzar a trabajar con las globales PrimerNode y UltimNode debes asignarles el valor nulo (puede darse el caso que les asigne un bloque de memoria con datos basura):
Código:
NodeDNS *PrimerNode = 0;
NodeDNS *UltimNode = 0;
Saludos
vosk