AYUDA! Urgente LISTAS ENLAZADAS DOBLES

Iniciado por dmon1, 17 Abril 2015, 06:01 AM

0 Miembros y 1 Visitante están viendo este tema.

dmon1

Gente, tengo un pequeño gran problema con este programa.

Cuando quiero finalizar la lista y salir del programa, me da este error "Unhandled exception at 0x00341459 in EJEM DOBLES.exe: 0xC0000005: Access violation reading location 0x00000004."

No encuentro que puede ser, ya que todo lo demás funciona perfecto.

Agradezco la ayuda!

#include <stdio.h>
#include <stdlib.h>

typedef struct snodo
{ int data;
struct snodo *ant, *sig;
} tnodo;

typedef tnodo *tpuntero;

void insertarelemento(tpuntero *, int);
int eliminarelemento(tpuntero *, int);
void mostrarlista(tpuntero);
int listavacia(tpuntero);
void borrarlista(tpuntero*);
void instruccions(void);

int main()
{ tpuntero inicio = NULL;
char choice;
int item;

instruccions();
fflush(stdin);
scanf("%c", &choice);
while (choice != '4')
{ switch (choice)
{ case '1':
printf("Ingrese un elemento a la lista\n");
fflush(stdin);
if (scanf("%d", &item) != 1)
{ printf("Error, debe ingresar un numero\n"); }
else
{ insertarelemento(&inicio, item); }
break;
case '2':
mostrarlista(inicio);
break;
case '3':
if (!listavacia(inicio)) //sino esta vacia
{ printf("Escriba el elemento que quiera eliminar\n");
fflush(stdin);
scanf("%d", &item);

if (eliminarelemento(&inicio, item)) //si lo encontró y borró
{ printf("El elemento %d fue eliminado\n", item);
mostrarlista(inicio); }  //muestra la lista luego de borrarlo
else    //si no lo encontro
{ printf("Elemento no encontrado\n\n", item); }
}
else
{ printf("La lista esta vacia\n"); }
break;
default:         //si la opcion es invalida le vuelve a preguntar
printf("Opcion invalida \n");
break;
}
instruccions();
fflush(stdin);
scanf("%c", &choice);
}
printf("FIN DEL PROGRAMA");
borrarlista(&inicio);
return 0;
}
void insertarelemento(tpuntero *inicio, int valor)
{
tpuntero anterior, actual, nuevo;
actual = *inicio;
anterior = NULL;
while (actual != NULL&&actual->data<valor)
{ anterior = actual;
actual = actual->sig; }
nuevo = (tpuntero)malloc(sizeof(tnodo));
nuevo->data = valor;
nuevo->ant = anterior;
nuevo->sig = actual;

if (anterior != NULL)
{ anterior->sig = nuevo; }
else
{ *inicio = nuevo; }
if (actual != NULL)
{ actual->ant = nuevo; }
}

int eliminarelemento(tpuntero *inicio, int valor)
{
tpuntero anterior, actual, temp;

if (valor == (*inicio)->data)
{ temp = *inicio;
*inicio = (*inicio)->sig;
free(temp);
return valor; }
else
{ anterior = *inicio;
actual = (*inicio)->sig;

while (actual != NULL&&actual->data != valor)
{ anterior = actual;
actual = actual->sig; }
if (actual != NULL)
{ temp = actual;
anterior->sig = actual->sig;
free(temp);
return valor; }
}
return 0;
}

void mostrarlista(tpuntero inicio)
{
if (inicio == NULL)
printf("La lista esta vacia\n");
else
{
tpuntero anterior;
anterior = NULL;
puts("IDA");
while (inicio != NULL)
{
printf("%2d", inicio->data);
anterior = inicio;
inicio = inicio->sig;
}
printf("\n");

puts("REGRESO");
while (anterior != NULL)
{
printf("%2d", anterior->data);
anterior = anterior->ant;
}
printf("\n");
}
}

int listavacia(tpuntero inicio)
{ return inicio == NULL; }

void borrarlista(tpuntero *inicio)
{
tpuntero nuevo, actual;
actual = *inicio;
while (actual->ant != NULL)
{ actual = actual->ant; }
while (actual != NULL)
{
nuevo = actual;
actual = actual->sig;
free(nuevo);
}
*inicio = NULL;
}

void instruccions(void)
{ printf("Elija su opcion:\n"
"1 Para insertar un elemento en la lista\n"
"2 Para mostrar lista  \n"
"3 Para eliminar un elemento de la lista\n"
"4 Para cerrar el programa\n"); }