Ver Mensaje Individual
  #15 (permalink)  
Antiguo 21/04/2013, 14:35
vosk
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 12 años, 6 meses
Puntos: 83
Respuesta: Error con clase de listas enlazadas.

A ver ante todo mucha calma: no se trata de resolver ejercicios, se trata de entender lo que estas haciendo; y como norma general no dejes las cosas para el ultimo momento.

Te da un sfault porque el constructor no está trabajando sobre el puntero de lista 'p'. Cuando creas la lista tienes que asignar al puntero 'p' el primer nodo, y para cada nodo apuntar al siguiente excepto para el ultimo nodo que apunta a nulo (o al primero si quieres una lista circular). Echa un vistazo al codigo que colgué antes; y si es necesario hazte un diagrama de flujo de datos en un papel y comprueba manualmente el funcionamiento.

Como el constructor no trabaja sobre 'p', en la funcion de escribir asignas 'p' a un puntero de recorrido, como 'p' es nulo el puntero tambien es nulo; compila correctamente porque el puntero de recorrido es de tipo Lista y tiene 'siguiente', pero ejecuta mal porque un nulo no contiene nada y al primer 'ptr = ptr->siguiente' peta.

Tambien te comenté otra cosa que no has implementado: las comprovaciones de error sirven para evitar precisamente estos casos. Si hubieras puesto un simple if(!ptr) verias que antes de entrar al ciclo de escritura el ptr ya es nulo independientemente de lo que diga el contador numnodos y por lo tanto podrias evitar el sfault. Todas las aplicaciones deben tener un control de errores, no para quedar bien con el cliente sino porque provocan agujeros de seguridad (como p.ej. ejecucion de codigo). Si yo fuese profesor y un alumno me entrega un ejecutable con una violacion de acceso le pongo un sin mirar nada mas. Por eso las comprovaciones de error son tan importantes.

Resumen: asigna el primer nodo creado al puntero 'p' y pon la comprovacion de error.

Saludos
vosk