• Sábado 14 de Diciembre de 2024, 20:37

Autor Tema:  Lista ligada  (Leído 2339 veces)

Checho360

  • Miembro activo
  • **
  • Mensajes: 84
    • Ver Perfil
Lista ligada
« en: Lunes 18 de Julio de 2011, 02:20 »
0
Buenas, estoy haciendo un programilla de una lista ligada que propone un libro pero no funciona. No sé si será un error muy tonto o tengo echo algo muy mal pero el caso es que no localizo el error.

Código: C
  1. #include <stdio.h>
  2.  
  3. #include <stdlib.h>
  4.  
  5. struct nodo{
  6.        
  7.         char letra;
  8.        
  9.         struct nodo *siguiente;
  10.        
  11. };
  12.  
  13. typedef struct nodo nuevoNodo;
  14.  
  15. typedef nuevoNodo *ptrnuevoNodo;
  16.  
  17. void menu ();
  18.  
  19. void imprimir_lista (ptrnuevoNodo lista);
  20.  
  21. int esta_vacia (ptrnuevoNodo lista);
  22.  
  23. void insertar_letra (ptrnuevoNodo * lista, char valor);
  24.  
  25. int eliminar_letra (ptrnuevoNodo * lista, char valor);
  26.  
  27. int main (){
  28.        
  29.         int opt = 1;
  30.        
  31.         char valor;
  32.        
  33.         ptrnuevoNodo lista = NULL;
  34.        
  35.         menu ();
  36.        
  37.         while ( opt != 4 ){
  38.                
  39.                 printf ("? ");
  40.                
  41.                 scanf ("%d", &opt);
  42.                
  43.                 switch ( opt ){
  44.                        
  45.                         case 1:
  46.                                
  47.                                 imprimir_lista (lista);
  48.                                
  49.                                 break;
  50.                                
  51.                         case 2:
  52.                                
  53.                                 printf ("Introduce un caracter\n");
  54.                                
  55.                                 scanf ("%c", &valor);
  56.                                
  57.                                 insertar_letra (&lista, valor);
  58.                                
  59.                                 imprimir_lista (lista);
  60.                                
  61.                                 break;
  62.                                
  63.                         case 3:
  64.                                
  65.                                 printf ("Introduce un caracter\n");
  66.  
  67.                                 scanf ("%c", &valor);
  68.                                
  69.                                 eliminar_letra (&lista, valor);
  70.                                
  71.                                 imprimir_lista (lista);
  72.                                
  73.                                 break;
  74.                                
  75.                         case 4:
  76.                                
  77.                                 break;
  78.                        
  79.                         default:
  80.                                
  81.                                 printf ("Opcion incorrecta\n");
  82.                                
  83.                                 menu ();
  84.                                
  85.                 }
  86.                        
  87.         }
  88.                
  89. }
  90.  
  91. void imprimir_lista (ptrnuevoNodo lista){
  92.        
  93.         if ( esta_vacia (lista) ){
  94.                
  95.                 printf ("La lista esta vacia \n");
  96.                
  97.         }
  98.        
  99.         else{
  100.        
  101.                 printf ("La lista es : \n");
  102.                
  103.                 while ( lista != NULL ){
  104.                        
  105.                         printf ("%c -> ", lista -> letra);
  106.                        
  107.                         lista = lista->siguiente;
  108.                        
  109.                 }
  110.                
  111.                 printf ("NULL\n");
  112.                
  113.         }
  114.        
  115. }
  116.  
  117. int esta_vacia (ptrnuevoNodo lista){
  118.        
  119.         return lista == NULL;
  120.        
  121. }
  122.  
  123. void insertar_letra (ptrnuevoNodo * lista, char valor){
  124.        
  125.         ptrnuevoNodo ptrNuevo = NULL;
  126.        
  127.         ptrNuevo = malloc ( sizeof ( struct nodo ) );
  128.        
  129.         if ( ptrNuevo == NULL ){
  130.                
  131.                 printf ("No hay memoria disponible \n");
  132.                
  133.         }
  134.        
  135.         else {
  136.                
  137.                 ptrNuevo->letra = valor;
  138.                
  139.                 ptrNuevo->siguiente = NULL;
  140.                
  141.                 ptrnuevoNodo ptrAnterior = NULL;
  142.                
  143.                 ptrnuevoNodo ptrActual;
  144.                
  145.                 ptrActual = *lista;
  146.                
  147.                 while ( ptrActual->letra < valor && ptrActual != NULL ){
  148.                        
  149.                         ptrAnterior = ptrActual;
  150.                        
  151.                         ptrActual = ptrActual -> siguiente;
  152.                        
  153.                 }
  154.                
  155.                 if ( ptrAnterior == NULL ){
  156.                        
  157.                         ptrNuevo->siguiente = ptrActual;
  158.                        
  159.                         *lista = ptrNuevo;
  160.                        
  161.                 }
  162.                
  163.                 else{
  164.                        
  165.                         ptrAnterior->siguiente = ptrNuevo;
  166.                        
  167.                         ptrNuevo->siguiente = ptrActual;
  168.                        
  169.                 }
  170.                
  171.         }
  172.        
  173. }
  174.  
  175. int eliminar_letra (ptrnuevoNodo * lista, char valor){
  176.        
  177.         ptrnuevoNodo ptrActual = *lista;
  178.        
  179.         ptrnuevoNodo temp = NULL;
  180.        
  181.         if ( ptrActual->letra == valor ){
  182.                
  183.                 temp = *lista;
  184.                
  185.                 *lista = (*lista) -> siguiente;
  186.                
  187.                 free (temp);
  188.                
  189.                 return 1;
  190.                
  191.         }
  192.        
  193.         else{
  194.                
  195.                 ptrnuevoNodo ptrAnterior = ptrActual;
  196.                
  197.                 ptrActual = (*lista)->siguiente;
  198.                
  199.                 while ( ptrActual->letra < valor && ptrActual != NULL ){
  200.                        
  201.                         ptrAnterior = ptrActual;
  202.                        
  203.                         ptrActual = ptrActual -> siguiente;
  204.                        
  205.                 }
  206.                
  207.                 ptrAnterior = ptrActual;
  208.                        
  209.                 ptrActual = ptrActual->siguiente;
  210.                
  211.                 ptrActual = ptrActual->siguiente;
  212.                
  213.                 ptrAnterior->siguiente= ptrActual;
  214.                
  215.         }
  216.        
  217. }
  218.  
  219. void menu (){
  220.        
  221.         printf ( "%s%s%s%s", "Introduce 1 para ver la lista \n",
  222.        
  223.         "Introduce 2 para añadir un elmento \n",
  224.        
  225.         "Introduce 3 para eliminar un elemento \n",
  226.        
  227.         "Introduce 4 para salir del programa \n");
  228.        
  229. }

Un saludo y muchas gracias de antemano.

ProfesorX

  • Moderador
  • ******
  • Mensajes: 796
  • Nacionalidad: mx
    • Ver Perfil
Re:Lista ligada
« Respuesta #1 en: Lunes 18 de Julio de 2011, 08:33 »
0
Hola, revise el codigo y esto es lo que encontre:

1. Utilizas void main(), y eso da problemas, lo correcto es declarar main como int, y agregar un return 0; para evitar errores es la compilacion:

http://www.parashift.com/c++-faq-lite/newbie.html#faq-29.3

2. Debes limpiar el buffer despues de hacer el scanf, y ademas es mejor utilizar getchar() para leer la letra que utilizar scanf.

3. En la funcion insertar_letra, la condicion del while debe ir invertida, para evitar que el programa se cierre con error en caso de que el puntero sea nulo.

4. El algoritmo para eliminar el elemento de la lista en la lista ordenada esta completamente equivocado, a continuacion un enlace con el algoritmo correcto:

http://www.algoritmia.net/articles.php?id=13

El resto de las funciones estan correctas.

Por ultimo te dejo el codigo de las funciones corregidas, revisalo y comparalo con el tuyo.

Código: C++
  1. int main (){
  2.  
  3.     int opt = 1;
  4.     char valor;
  5.     ptrnuevoNodo lista = NULL;
  6.  
  7.     menu ();
  8.  
  9.     while ( opt != 4 ){
  10.         printf ("? ");
  11.         scanf ("%d", &opt);
  12.         // Borrar el buffer despues de leer la opcion
  13.         while (getchar() != '\n');
  14.  
  15.         switch ( opt ){
  16.         case 1:
  17.             imprimir_lista (lista);
  18.             break;
  19.         case 2:
  20.             printf ("Introduce un caracter\n");
  21.             // Usar getchar() en lugar de scanf
  22.             //scanf ("%c", &valor);
  23.             valor = getchar();
  24.             insertar_letra (&lista, valor);
  25.             imprimir_lista (lista);
  26.             break;
  27.         case 3:
  28.             printf ("Introduce un caracter\n");
  29.             scanf ("%c", &valor);
  30.             eliminar_letra (&lista, valor);
  31.             imprimir_lista (lista);
  32.             break;
  33.             // Innecesaria
  34.             //case 4:
  35.             //    break;
  36.         default:
  37.             printf ("Opcion incorrecta\n");
  38.             menu ();
  39.  
  40.         } // switch
  41.     } // while
  42. }
  43.  
  44. void insertar_letra (ptrnuevoNodo * lista, char valor){
  45.  
  46.     ptrnuevoNodo ptrNuevo = NULL;
  47.     ptrNuevo = (struct nodo*) malloc ( sizeof ( struct nodo ) );
  48.  
  49.     if ( ptrNuevo == NULL ){
  50.         printf ("No hay memoria disponible \n");
  51.     }
  52.     else {
  53.         ptrNuevo->letra = valor;
  54.         ptrNuevo->siguiente = NULL;
  55.         ptrnuevoNodo ptrAnterior = NULL;
  56.         ptrnuevoNodo ptrActual;
  57.         ptrActual = *lista;
  58.  
  59.         //while ( ptrActual->letra < valor && ptrActual != NULL ){
  60.         while ( ptrActual != NULL && ptrActual->letra < valor ) {
  61.             ptrAnterior = ptrActual;
  62.             ptrActual = ptrActual -> siguiente;
  63.         }
  64.  
  65.         if ( ptrAnterior == NULL ){
  66.             ptrNuevo->siguiente = ptrActual;
  67.             *lista = ptrNuevo;
  68.         }
  69.  
  70.         else{
  71.             ptrAnterior->siguiente = ptrNuevo;
  72.             ptrNuevo->siguiente = ptrActual;
  73.         }
  74.     }
  75. }
  76.  
  77. void eliminar_letra (ptrnuevoNodo * lista, char valor){
  78.  
  79.     ptrnuevoNodo ptrActual, ptrAnterior;
  80.     ptrActual = ptrAnterior = *lista;
  81.  
  82.     /* 1.- busca su posicion. Es casi igual que en la insercion, ojo al (<) */
  83.     while (ptrActual != NULL && ptrActual->letra < valor) {
  84.         ptrAnterior = ptrActual;
  85.         ptrActual = ptrActual->siguiente;
  86.     }
  87.  
  88.     /* 2.- Lo borra si existe */
  89.     if (ptrActual != NULL && ptrActual->letra == valor) {
  90.         if (ptrAnterior == ptrActual)        /* borrar el primero */
  91.             *lista = ptrActual->siguiente;   /* o tambien (*L)->sig; */
  92.         else                                 /* borrar en otro sitio */
  93.             ptrAnterior->siguiente = ptrActual->siguiente;
  94.         free(ptrActual);
  95.     }
  96. }
  97.  

Saludos :)

NOTA:
==================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
==================================================================

Checho360

  • Miembro activo
  • **
  • Mensajes: 84
    • Ver Perfil
Re:Lista ligada
« Respuesta #2 en: Lunes 18 de Julio de 2011, 17:26 »
0
Hola ProfesorX. Muchas gracias por contestar y por hacerlo de forma precisa y clara. Me ha servido de mucha ayuda!!