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ú

Mensajes - 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
Genial !!

Muchas gracias por la ayuda, dejo el código completo funcionando perfectamente.

Ahora voy a tratar de implementarlo para una lista doblemente enlazada. Cualquier cosa, hago otro post.

Saludos :)


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

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

typedef LISTNODE *LISTNODEPTR;

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

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

instruccions();
fflush(stdin);
scanf("%c", &choice);

while (choice != '3')
{
switch (choice)
{
case '1':
printf("Ingrese un elemento a la lista\n");
fflush(stdin);
scanf("%c", &item);
insert(&startPtr, item);
printList(startPtr);
break;
case '2':
if (!isEmpty(startPtr))
{
printf("Escriba el elemento que quiera eliminar\n");
fflush(stdin);
scanf("%c", &item);

if (deleter(&startPtr, item))
{
printf("El elemento %c fue eliminado\n", item);
printList(startPtr);
}
else
{
printf("%c Elemento no encontrado\n\n", item);
}
}
else
{
printf("La lista está 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");

return 0;
}

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

void insert(LISTNODEPTR *sPtr, char value)
{
LISTNODEPTR currentPtr, previousPtr, newPtr;
currentPtr = *sPtr;
previousPtr = NULL;
while (currentPtr != NULL&&currentPtr->data<value)
{
previousPtr = currentPtr;
currentPtr = currentPtr->nextPtr;
}
newPtr = (LISTNODEPTR)malloc(sizeof(LISTNODE));
newPtr->data = value;
newPtr->nextPtr = currentPtr;
if (previousPtr != NULL)
{
previousPtr->nextPtr = newPtr;
}
else
{
*sPtr = newPtr;
}

}
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("La lista esta vacia\n\n");

else
{
printf("LA LISTA ES:\n");
while (currentPtr != NULL)
{
printf(" %c-->", currentPtr->data);
currentPtr = currentPtr->nextPtr;
}
printf("NULL \n\n");
}
}

#3
Muchas gracias! Ahora si logra compilar  :D

Lo que no logro resolver es borrar elementos luego de insertarlos, es eso posible?
Es decir que si elijo "case 1" me deja insertarlos pero si despues quisiera borrarlos, como deberia hacerlo?

Falta la ultima parte de liberar memoria, voy a averiguar como se hace por que no me lo explicaron

Sorry por las GESHI, no logro cambiarles el color

Asi me quedo el codigo:

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

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

typedef LISTNODE *LISTNODEPTR;

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

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

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

   do
   {
      switch (choice)
      {
      case 1:
         printf("enter a character\n");
         scanf("%c\n", &item);
         insert(&startPtr, item);
         printList(startPtr);
         break;
      case 2:
         if (!isEmpty(startPtr))
         {
            printf("enter character to be deleted");
            scanf(" %c\n", &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;

      case 3:
         printf("invalid choice \n");
      default:         //si la opcion es invalida le vuelve a preguntar
         printf("invalid choice \n");
         break;
      }
   }
   
   while (choice != 3);
   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");
   }
}
#4
Gracias!!

Rindo ese tema en pocos días y tengo que demostrar que funcionan bien las opciones.
#5
1- Es mi primer post, no tenia idea de las GeShi
2- Es una lista enlazada que a partir de una eleccion (switch) ejecuta una u otra funcion
3- El error es este: fatal error LNK1169: one or more multiply defined symbols found
Solo encontre que faltaba cerrar la llave en la declaracion de la funcion Insert.
Gracias
#6
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,