elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Únete al Grupo Steam elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  listas enlazadas simples
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: listas enlazadas simples  (Leído 1,992 veces)
dmon1

Desconectado Desconectado

Mensajes: 6


Ver Perfil
listas enlazadas simples
« en: 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
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. struct listNode{
  5. char data;
  6. struct listNode *nextPtr;
  7. };
  8. typedef struct listNode LISTNODE;
  9. typedef LISTNODE *LISTNODEPTR;
  10.  
  11. void insert(LISTNODEPTR *, char);
  12. char deleter(LISTNODEPTR *, char);
  13. int isEmpty(LISTNODEPTR);
  14. void printList(LISTNODEPTR);
  15. void instruccions(void);
  16.  
  17. main()
  18. {
  19. LISTNODEPTR startPtr = NULL;
  20. int choice;
  21. char item;
  22.  
  23. instruccions();
  24. printf("?");
  25. scanf("%d",&choice);
  26.  
  27. while (choice!= 3)
  28. {
  29. switch (choice)
  30. {
  31. case 1:
  32. printf("enter a character");
  33. scanf("n%c", &item);
  34. insert(&startPtr, item);
  35. printList(startPtr);
  36. break;
  37. case 2:
  38. if (!isEmpty(startPtr))
  39. {
  40. printf("enter character to be deleted");
  41. scanf("\n%c", &item);
  42.  
  43. if (deleter(&startPtr, item))
  44. {
  45. printf("%c deleted", item);
  46. printList(startPtr);
  47. }
  48. else
  49. {
  50. printf("%c not found\n", item);
  51. }
  52. }
  53. else
  54. {
  55. printf("List is empty\n");
  56. }
  57. break;
  58. default:         //si la opcion es invalida le vuelve a preguntar
  59. printf("invalid choice \n");
  60. instruccions();
  61. break;
  62. }
  63. printf("?");
  64. scanf("%d", &choice);
  65. }
  66. printf("end of run\n");
  67. return 0;
  68. }
  69.  
  70. void instruccions(void) //mostrar opciones
  71. {
  72. printf("enter your choice:\n"
  73. "1 to insert an element into the list\n"
  74. "2 to delete an element from the list\n"
  75. "3 to end\n");
  76. }
  77.  
  78. void insert(LISTNODEPTR *sPtr, char value)
  79. {
  80. LISTNODEPTR newPtr, previousPtr, currentPtr;
  81.  
  82. newPtr =(LISTNODEPTR) malloc(sizeof(LISTNODE));
  83.  
  84. if (newPtr != NULL)
  85. {
  86. newPtr->data = value;
  87. newPtr->nextPtr = NULL;
  88.  
  89. previousPtr = NULL;
  90. currentPtr = *sPtr;
  91.  
  92. while (currentPtr != NULL&&value > currentPtr->data)
  93. {
  94. previousPtr = currentPtr;
  95. currentPtr = currentPtr->nextPtr;
  96. }
  97.  
  98. if (previousPtr == NULL)
  99. {
  100. newPtr->nextPtr = *sPtr;
  101. *sPtr = newPtr;
  102. }
  103. else
  104. {
  105. previousPtr->nextPtr = newPtr;
  106. newPtr->nextPtr = currentPtr;
  107. }
  108. }
  109. else
  110. {
  111. printf("%c not inserted no memmory avalaible\n", value);
  112. }
  113.  
  114.  
  115.  
  116. char deleter(LISTNODEPTR *sPtr, char value)
  117. {
  118. LISTNODEPTR tempPtr, previousPtr, currentPtr;
  119.  
  120. if (value == (*sPtr)->data)
  121. {
  122. tempPtr = *sPtr;
  123. *sPtr = (*sPtr)->nextPtr;
  124. free(tempPtr);
  125. return value;
  126. }
  127. else
  128. {
  129. previousPtr = *sPtr;
  130. currentPtr = (*sPtr)->nextPtr;
  131.  
  132. while (currentPtr != NULL&&currentPtr->data != value)
  133. {
  134. previousPtr = currentPtr;
  135. currentPtr = currentPtr->NextPtr;
  136. }
  137. if (currentPtr != NULL)
  138. {
  139. tempPtr = currentPtr;
  140. previousPtr->nextPtr = currentPtr->nextPtr;
  141. free (tempPtr);
  142. return value;
  143. }
  144. }
  145. return 0;
  146. }
  147.  
  148. int isEmpty(LISTNODEPTR sPtr)
  149. {
  150. return sPtr == NULL;
  151. }
  152.  
  153. void printList(LISTNODEPTR currentPtr)
  154. {
  155. if (currentPtr == NULL)
  156.  
  157. printf("List is empty");
  158.  
  159. else
  160. {
  161. printf("the list is:");
  162. while (currentPtr != NULL)
  163. {
  164. printf("%c --> ", currentPtr->data);
  165. currentPtr = currentPtr->nextPtr;
  166. }
  167. printf("NULL \n\n");
  168. }
  169. }
  170.  


Mod: modificado el código con etiquetas GeSHi,


« Última modificación: 13 Abril 2015, 04:12 am por engel lex » En línea

DarK_FirefoX


Desconectado Desconectado

Mensajes: 1.250


Be the change you wanna see in te world


Ver Perfil
Re: listas enlazadas simples
« Respuesta #1 en: 13 Abril 2015, 02:58 am »

1ro - Utiliza las etiquetas GeSHi si vas a publicar código
2do- Podrías dar un poco de información sobre el error, no somos adivinos


En línea

dmon1

Desconectado Desconectado

Mensajes: 6


Ver Perfil
Re: listas enlazadas simples
« Respuesta #2 en: 13 Abril 2015, 03:30 am »

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
En línea

DarK_FirefoX


Desconectado Desconectado

Mensajes: 1.250


Be the change you wanna see in te world


Ver Perfil
Re: listas enlazadas simples
« Respuesta #3 en: 13 Abril 2015, 05:34 am »

1- Es mi primer post, no tenia idea de las GeShi

Pasate por aquí ;) http://foro.elhacker.net/reglas.htm

PD: Estoy revisando
En línea

dmon1

Desconectado Desconectado

Mensajes: 6


Ver Perfil
Re: listas enlazadas simples
« Respuesta #4 en: 13 Abril 2015, 16:36 pm »

Gracias!!

Rindo ese tema en pocos días y tengo que demostrar que funcionan bien las opciones.
En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: listas enlazadas simples
« Respuesta #5 en: 13 Abril 2015, 17:13 pm »

Línea 33: scanf ( "n%c", &item ); <<-- debería ser \n

Línea 136: currentPtr = currentPtr->NextPtr; <-- esa 'n' debería ir en minúsculas

Código
  1.  instruccions();
  2.  scanf ( "%d", &choice );
  3.  
  4.  while ( choice != 3 )
  5.  {
  6.    // ...
  7.  
  8.    printf ( "?" );
  9.    scanf( "%d", &choice );
  10.  }
  11.  

Por qué actualizar "choice" en dos sitios diferentes??

si usas "do-while" en vez de "while" puedes eliminar uno de los usos... además, sería recomendable poner las instrucciones siempre salvo que pretendas que el usuario se las apunte nada más arrancar el programa:

Código
  1.  do
  2.  {
  3.    instruccions();
  4.    scanf ( "\n%d", &choice );
  5.  
  6.    // ...
  7.  } while ( choice != 3 );
  8.  

Claro, ahora tienes que añadir al "switch" un "case 3" para evitar mostrar las instrucciones al salir:

Código
  1.      case 3:
  2.        break;
  3.  
  4.      default:         //si la opcion es invalida le vuelve a preguntar
  5.        printf ( "invalid choice \n" );
  6.        //instruccions(); <<-- Esto también sobra ya
  7.        break;
  8.  

Luego, no se si te has dado cuenta, pero los elementos los estás insertando al inicio de la lista... no al final, no se si esa parte la tienes que programar así, aunque me da que no.

y bueno, luego te toca arreglar algun detalle relacionado con la forma de presentar los mensajes... pero eso ya corre de tu cuenta.

Ah bueno, sí, se me olvidaba jejeje. No estás liberando la memoria reservada por la lista una vez finalizas el programa... deberías plantearte corregir eso también.

Un saludo
« Última modificación: 13 Abril 2015, 17:16 pm por eferion » En línea

dmon1

Desconectado Desconectado

Mensajes: 6


Ver Perfil
Re: listas enlazadas simples
« Respuesta #6 en: 13 Abril 2015, 18:14 pm »

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");
   }
}
En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: listas enlazadas simples
« Respuesta #7 en: 14 Abril 2015, 07:52 am »

Las GeSHi te explico: Habrás notado que, al escribir un mensaje, tienes una serie de botones encima del TextBox para, por ejemplo, poner el texto en negrita, cursiva o subrayado, elegir la alineación del texto, etc... uno de esos controles es un ComboBox con el texto GeSHi. Si despliegas esa lista verás que aparece el nombre de varios lenguajes de programación... elijes el que corresponda y te añadirá un par de etiquetas (una de apertura y otra de cierre) a tu mensaje... pon el código entre medias y listo. También funciona si pones el código, lo seleccionas y luego elijes el idioma en el desplegable.

Para borrar un elemento de una lista tienes 3 posibilidades:

1. El elemento a borrar es el primero. Tienes que hacer que el puntero de inicio de la lista pase al siguiente elemento:
A -> B -> C -> NULL ==> B -> C -> NULL

2. El elemento a borrar es el último. Simplemente pones a NULL el puntero "sig" del penúltimo elemento:
A -> B -> C -> NULL ==> A -> B -> NULL

3. El elemento está en el medio de la lista. En este caso tienes que hacer que el puntero "sig" del elemento anterior apunte al elemento que sigue al actual:
A -> B -> C -> NULL ==> A -> C -> NULL

En cualquiera de los tres casos no te olvides de liberar la memoria del elemento recién liberado.

Para liberar la memoria reservada por un malloc (o calloc o realloc) tienes que usar la función free:

Código
  1. // Reserva de memoria
  2. int* ptr = (int*)malloc( 100 *sizeof( int ) );
  3.  
  4. // Se libera la memoria. Vuelve a estar disponible
  5. free( ptr );

Un saludo
En línea

dmon1

Desconectado Desconectado

Mensajes: 6


Ver Perfil
Re: listas enlazadas simples
« Respuesta #8 en: 15 Abril 2015, 05:00 am »

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 :)


Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. typedef struct listNode{
  5. char data;
  6. struct listNode *nextPtr;
  7. }LISTNODE;
  8.  
  9. typedef LISTNODE *LISTNODEPTR;
  10.  
  11. void insert(LISTNODEPTR *, char);
  12. char deleter(LISTNODEPTR *, char);
  13. void printList(LISTNODEPTR);
  14. int isEmpty(LISTNODEPTR);
  15. void instruccions(void);
  16.  
  17. int main()
  18. {
  19. LISTNODEPTR startPtr = NULL;
  20. char choice, item;
  21.  
  22. instruccions();
  23. fflush(stdin);
  24. scanf("%c", &choice);
  25.  
  26. while (choice != '3')
  27. {
  28. switch (choice)
  29. {
  30. case '1':
  31. printf("Ingrese un elemento a la lista\n");
  32. fflush(stdin);
  33. scanf("%c", &item);
  34. insert(&startPtr, item);
  35. printList(startPtr);
  36. break;
  37. case '2':
  38. if (!isEmpty(startPtr))
  39. {
  40. printf("Escriba el elemento que quiera eliminar\n");
  41. fflush(stdin);
  42. scanf("%c", &item);
  43.  
  44. if (deleter(&startPtr, item))
  45. {
  46. printf("El elemento %c fue eliminado\n", item);
  47. printList(startPtr);
  48. }
  49. else
  50. {
  51. printf("%c Elemento no encontrado\n\n", item);
  52. }
  53. }
  54. else
  55. {
  56. printf("La lista está vacia\n");
  57. }
  58. break;
  59.  
  60. default:         //si la opcion es invalida le vuelve a preguntar
  61. printf("Opcion invalida \n");
  62. break;
  63. }
  64.  
  65. instruccions();
  66. fflush(stdin);
  67. scanf("%c", &choice);
  68.  
  69. }
  70.  
  71. printf("FIN DEL PROGRAMA");
  72.  
  73. return 0;
  74. }
  75.  
  76. void instruccions(void) //mostrar opciones
  77. {
  78. printf("Elija su opcion:\n"
  79. "1 Para insertar un elemento en la lista\n"
  80. "2 Para eliminar un elemento de la lista \n"
  81. "3 Para cerrar el programa\n");
  82. }
  83.  
  84. void insert(LISTNODEPTR *sPtr, char value)
  85. {
  86. LISTNODEPTR currentPtr, previousPtr, newPtr;
  87. currentPtr = *sPtr;
  88. previousPtr = NULL;
  89. while (currentPtr != NULL&&currentPtr->data<value)
  90. {
  91. previousPtr = currentPtr;
  92. currentPtr = currentPtr->nextPtr;
  93. }
  94. newPtr = (LISTNODEPTR)malloc(sizeof(LISTNODE));
  95. newPtr->data = value;
  96. newPtr->nextPtr = currentPtr;
  97. if (previousPtr != NULL)
  98. {
  99. previousPtr->nextPtr = newPtr;
  100. }
  101. else
  102. {
  103. *sPtr = newPtr;
  104. }
  105.  
  106. }
  107. char deleter(LISTNODEPTR *sPtr, char value)
  108. {
  109. LISTNODEPTR tempPtr, previousPtr, currentPtr;
  110.  
  111. if (value == (*sPtr)->data)
  112. {
  113. tempPtr = *sPtr;
  114. *sPtr = (*sPtr)->nextPtr;
  115. free(tempPtr);
  116. return value;
  117. }
  118. else
  119. {
  120. previousPtr = *sPtr;
  121. currentPtr = (*sPtr)->nextPtr;
  122.  
  123. while (currentPtr != NULL&&currentPtr->data != value)
  124. {
  125. previousPtr = currentPtr;
  126. currentPtr = currentPtr->nextPtr;
  127. }
  128. if (currentPtr != NULL)
  129. {
  130. tempPtr = currentPtr;
  131. previousPtr->nextPtr = currentPtr->nextPtr;
  132. free(tempPtr);
  133. return value;
  134. }
  135. }
  136. return 0;
  137. }
  138.  
  139. int isEmpty(LISTNODEPTR sPtr)
  140. {
  141. return sPtr == NULL;
  142. }
  143.  
  144. void printList(LISTNODEPTR currentPtr)
  145. {
  146. if (currentPtr == NULL)
  147.  
  148. printf("La lista esta vacia\n\n");
  149.  
  150. else
  151. {
  152. printf("LA LISTA ES:\n");
  153. while (currentPtr != NULL)
  154. {
  155. printf(" %c-->", currentPtr->data);
  156. currentPtr = currentPtr->nextPtr;
  157. }
  158. printf("NULL \n\n");
  159. }
  160. }
  161.  
  162.  
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Listas enlazadas en c++
Programación C/C++
N3r0 3 7,343 Último mensaje 13 Julio 2010, 12:42 pm
por N3r0
listas enlazadas simples en c++(soy novato)
Programación C/C++
pein 1 2,997 Último mensaje 9 Octubre 2010, 03:25 am
por Littlehorse
[C] Listas enlazadas.
Programación C/C++
The Swash 5 29,766 Último mensaje 26 Octubre 2011, 04:56 am
por brians444
listas enlazadas
Programación C/C++
javier210186 3 1,801 Último mensaje 25 Octubre 2011, 02:33 am
por javier210186
Listas Enlazadas Simples Metodos de ordenamiento
Programación C/C++
david.albornoz 1 3,571 Último mensaje 14 Octubre 2018, 09:14 am
por Beginner Web
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines