Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Temas - dmon1

#1
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"); }
#2
Programación C/C++ / listas enlazadas simples
13 Abril 2015, 01:56 AM
Por favor podrian ayudarme con este codigo?
Lo saque de un libro pero no compila, son listas enlazadas simples
No encuentro el error. Gracias!!

Código (cpp) [Seleccionar]
#include <stdio.h>
#include <stdlib.h>

struct listNode{
char data;
struct listNode *nextPtr;
};
typedef struct listNode LISTNODE;
typedef LISTNODE *LISTNODEPTR;

void insert(LISTNODEPTR *, char);
char deleter(LISTNODEPTR *, char);
int isEmpty(LISTNODEPTR);
void printList(LISTNODEPTR);
void instruccions(void);

main()
{
LISTNODEPTR startPtr = NULL;
int choice;
char item;

instruccions();
printf("?");
scanf("%d",&choice);

while (choice!= 3)
{
switch (choice)
{
case 1:
printf("enter a character");
scanf("n%c", &item);
insert(&startPtr, item);
printList(startPtr);
break;
case 2:
if (!isEmpty(startPtr))
{
printf("enter character to be deleted");
scanf("\n%c", &item);

if (deleter(&startPtr, item))
{
printf("%c deleted", item);
printList(startPtr);
}
else
{
printf("%c not found\n", item);
}
}
else
{
printf("List is empty\n");
}
break;
default:         //si la opcion es invalida le vuelve a preguntar
printf("invalid choice \n");
instruccions();
break;
}
printf("?");
scanf("%d", &choice);
}
printf("end of run\n");
return 0;
}

void instruccions(void) //mostrar opciones
{
printf("enter your choice:\n"
"1 to insert an element into the list\n"
"2 to delete an element from the list\n"
"3 to end\n");
}

void insert(LISTNODEPTR *sPtr, char value)
{
LISTNODEPTR newPtr, previousPtr, currentPtr;

newPtr =(LISTNODEPTR) malloc(sizeof(LISTNODE));

if (newPtr != NULL)
{
newPtr->data = value;
newPtr->nextPtr = NULL;

previousPtr = NULL;
currentPtr = *sPtr;

while (currentPtr != NULL&&value > currentPtr->data)
{
previousPtr = currentPtr;
currentPtr = currentPtr->nextPtr;
}

if (previousPtr == NULL)
{
newPtr->nextPtr = *sPtr;
*sPtr = newPtr;
}
else
{
previousPtr->nextPtr = newPtr;
newPtr->nextPtr = currentPtr;
}
}
else
{
printf("%c not inserted no memmory avalaible\n", value);
}



char deleter(LISTNODEPTR *sPtr, char value)
{
LISTNODEPTR tempPtr, previousPtr, currentPtr;

if (value == (*sPtr)->data)
{
tempPtr = *sPtr;
*sPtr = (*sPtr)->nextPtr;
free(tempPtr);
return value;
}
else
{
previousPtr = *sPtr;
currentPtr = (*sPtr)->nextPtr;

while (currentPtr != NULL&&currentPtr->data != value)
{
previousPtr = currentPtr;
currentPtr = currentPtr->NextPtr;
}
if (currentPtr != NULL)
{
tempPtr = currentPtr;
previousPtr->nextPtr = currentPtr->nextPtr;
free (tempPtr);
return value;
}
}
return 0;
}

int isEmpty(LISTNODEPTR sPtr)
{
return sPtr == NULL;
}

void printList(LISTNODEPTR currentPtr)
{
if (currentPtr == NULL)

printf("List is empty");

else
{
printf("the list is:");
while (currentPtr != NULL)
{
printf("%c --> ", currentPtr->data);
currentPtr = currentPtr->nextPtr;
}
printf("NULL \n\n");
}
}



Mod: modificado el código con etiquetas GeSHi,