En tu programa utilizas solo la biblioteca estándar de C cuando, por el uso de new, se trata de C++. Si estas aprendiendo C++ enfocate en su biblioteca estándar. En cuanto al uso intercalado de scanf y fgets (el problema similar en C++ aparece con el uso del operador ">>" y getline) hay un montón de temas en la base de datos de los foros, solo es cuestión de utilizar el motor de búsqueda.
También por favor lee el tema
|Lo que no hay que hacer en C/C++. Nivel basico|.
----
Los problemas en su mayoría se encuentran en la función "borrarNodo", el que mencionas se genera si el nodo a eliminar no existe debido a este bucle:
printf("INTRODUZCA EL ID A ELIMINAR: ");
scanf("%d", &aux->dato);
while (aux->dato != nuevo->dato){
ant = nuevo;
nuevo = nuevo->puntero;
}
En el se itera una y otra vez hasta encontrar un nodo con el valor buscado, si eso no sucede se tratara de procesar el nodo después del ultimo (NULL) causando el error que mencionas al realizar la operación (NULL)->puntero.
----
Mira que pensaba poner un listado de los errores en esa función pero, y
recalco que no quiero sonar grosero, son demasiados: reservas memoria cuando no es necesario, no revisas si se alcanza el final de la lista, los nombres de las variables son malos ("nuevo" es el puntero para iterar la lista), hay que tener en cuenta variables "globales" que no son necesarias, etc..
La base para eliminar un nodo es:
void borrarNodo()
{
if (inicio == NULL)
puts("Lista vacia");
else {
nodo *aux;
int dato;
puts("Dato a eliminar:");
scanf("%d", &dato);
if (inicio->dato == dato){
// Eliminamos el primero
aux = inicio;
inicio = inicio->puntero;
free(aux);
}else {
// Eliminamos (si aplica) algun nodo despues del primero
nodo *p = inicio;
while (p->puntero != NULL && p->puntero->dato != dato)
p = p->puntero;
// ...
}
}
}
Por supuesto no esta completo, falta la parte mas importante y difícil (eliminar un nodo después del primero). Inténtalo tu solo y si tienes problemas te ayudamos.
Un saludo