En la funcion 'agregar' cuando detectas una repeticion debes salir del ciclo, o como minimo no usar los datos eliminados; pon el caso que intentas poner una repeticion en este ciclo:
Código C++:
Ver originalwhile(apunt->sig != NULL) {
if(nuevo->dato == apunt->dato) {
cout << "El nodo a agregar ya existe" << endl;
delete nuevo;
}
apunt = apunt->sig;
}
anterior = buscarLista(nuevo->dato);
Cuando eliminas 'nuevo' ya no debes trabajar con ese puntero, aun cuando puede quedar memoria basura no será accesible, por eso cuando 'nuevo' está eliminado y no sales del ciclo lo siguiente que haces es 'buscarLista' enviando como argumento algo a lo que ya no tienes acceso:
Código C++:
Ver originaldelete nuevo;
anterior = buscarLista(nuevo->dato);//violacion de segmento
Lo que debes hacer es solicitar el nuevo dato, buscar si existe, si existe notificas el error, preguntas si quiere seguir, si no existe bloqueas memoria para el nuevo nodo y lo añades a la lista. Y para estar aun mas perfecto deberias separar las funciones de insertar de las de popular datos: la funcion de popular datos sería el ciclo de añadir mas datos, solicita un dato y lo busca, si existe notifica el error y continua, si no existe llama a la funcion que inserte el nodo.
Saludos
vosk