Ver Mensaje Individual
  #12 (permalink)  
Antiguo 25/07/2013, 13:03
vosk
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: Guia_Listas_Enlazadas - C++

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 original
  1. while(apunt->sig != NULL) {
  2.     if(nuevo->dato == apunt->dato) {
  3.         cout << "El nodo a agregar ya existe" << endl;
  4.         delete nuevo;
  5.     }
  6.     apunt = apunt->sig;
  7. }
  8. 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 original
  1. delete nuevo;
  2. 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