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();
while (choice != '4')
{ switch (choice)
{ case '1':
printf("Ingrese un elemento a la lista\n"); 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");
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
break;
}
instruccions();
}
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;
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;
return valor; }
}
return 0;
}
void mostrarlista(tpuntero inicio)
{
if (inicio == NULL)
printf("La lista esta vacia\n"); else
{
tpuntero anterior;
anterior = NULL;
while (inicio != NULL)
{
anterior = inicio;
inicio = inicio->sig;
}
while (anterior != NULL)
{
printf("%2d", anterior
->data
); anterior = anterior->ant;
}
}
}
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;
}
*inicio = NULL;
}
void instruccions(void)
"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"); }