El programa revienta en el caso que mencionas porque cuando agregas un elemento como primero debes actualizar (si la lista no esta vacía) el campo "ant" del nodo "cabeza", de esta forma:
Otros dos escenarios donde el programa revienta son:
* Insertar antes del primer elemento.
* Insertar después del ultimo elemento.
La razón es similar: debes verificar si el elemento anterior/posterior existe antes de tratar de realizar los cambios y en el caso de la inserción antes de un nodo debes verificar si ello requiere la actualización del puntero al primer nodo (la variable "cabeza").
Por ultimo deberías eliminar la función "anterior" y rescribir las funciones "insertar_antes" e "insertar_despues" desde cero ya que son un dolor de cabeza y su código es idéntico.
Un saludo
Código (c) [Seleccionar]
void insertarCabeza(int valor,Nodo **cabeza)
{
Nodo *nuevo;
nuevo = crearNodo(valor);
nuevo->sig = *cabeza;
nuevo->ant = NULL;
if (*cabeza != NULL)
(*cabeza)->ant = nuevo;
*cabeza = nuevo;
}
Otros dos escenarios donde el programa revienta son:
* Insertar antes del primer elemento.
* Insertar después del ultimo elemento.
La razón es similar: debes verificar si el elemento anterior/posterior existe antes de tratar de realizar los cambios y en el caso de la inserción antes de un nodo debes verificar si ello requiere la actualización del puntero al primer nodo (la variable "cabeza").
Por ultimo deberías eliminar la función "anterior" y rescribir las funciones "insertar_antes" e "insertar_despues" desde cero ya que son un dolor de cabeza y su código es idéntico.
Un saludo