Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Lista ligada

Estas en el tema de Lista ligada en el foro de C/C++ en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 17/07/2011, 18:22
 
Fecha de Ingreso: marzo-2011
Mensajes: 94
Antigüedad: 13 años, 1 mes
Puntos: 3
Lista ligada

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:
Ver original
  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.
  #2 (permalink)  
Antiguo 17/07/2011, 18:24
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: Lista ligada

Recomiendo incluir que es lo que falla o funciona.
Nada funciona?
Existe un subconjunto de pasos que sí funciona?
Que entradas le das al programa? como lo pruebas o como lo intentas probar?
  #3 (permalink)  
Antiguo 17/07/2011, 18:58
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: Lista ligada

Tu error es muy boludo. Todo lo demas anda perfecto, Pero mira la linea 147. Primero debes chequear que el puntero a actual no sea null y despues buscar el valor dentro de la estructura. En el caso que es null vos estabas tratando de acceder al lugar cero de la memoria. Y eso te genera el error.

Con invertir las condiciones funciona perfecto el programa. Salados

Código C:
Ver original
  1. while ( ptrActual != NULL && ptrActual->letra < valor   ){
  #4 (permalink)  
Antiguo 18/07/2011, 07:06
 
Fecha de Ingreso: marzo-2011
Mensajes: 94
Antigüedad: 13 años, 1 mes
Puntos: 3
Respuesta: Lista ligada

Tienes razón, muchas gracias por la ayuda, ahora lo estoy revisando que todavía tiene alguna cosilla por ahí pero el programa ya tira.

Un saludo!

Etiquetas: funcion, lista, programa
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:19.