Programación General > C/C++

 Lista ligada

(1/1)

Checho360:
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 ---#include <stdio.h> #include <stdlib.h> struct nodo{                char letra;                struct nodo *siguiente;        }; typedef struct nodo nuevoNodo; typedef nuevoNodo *ptrnuevoNodo; void menu (); void imprimir_lista (ptrnuevoNodo lista); int esta_vacia (ptrnuevoNodo lista); void insertar_letra (ptrnuevoNodo * lista, char valor); int eliminar_letra (ptrnuevoNodo * lista, char valor); int main (){                int opt = 1;                char valor;                ptrnuevoNodo lista = NULL;                menu ();                while ( opt != 4 ){                                printf ("? ");                                scanf ("%d", &opt);                                switch ( opt ){                                                case 1:                                                                 imprimir_lista (lista);                                                                break;                                                        case 2:                                                                printf ("Introduce un caracter\n");                                                                scanf ("%c", &valor);                                                                insertar_letra (&lista, valor);                                                                imprimir_lista (lista);                                                                break;                                                        case 3:                                                                printf ("Introduce un caracter\n");                                 scanf ("%c", &valor);                                                                eliminar_letra (&lista, valor);                                                                imprimir_lista (lista);                                                                break;                                                        case 4:                                                                break;                                                default:                                                                printf ("Opcion incorrecta\n");                                                                menu ();                                                }                                }                } void imprimir_lista (ptrnuevoNodo lista){                if ( esta_vacia (lista) ){                                printf ("La lista esta vacia \n");                        }                else{                        printf ("La lista es : \n");                                while ( lista != NULL ){                                                printf ("%c -> ", lista -> letra);                                                lista = lista->siguiente;                                        }                                printf ("NULL\n");                        }        } int esta_vacia (ptrnuevoNodo lista){                return lista == NULL;        } void insertar_letra (ptrnuevoNodo * lista, char valor){                ptrnuevoNodo ptrNuevo = NULL;                ptrNuevo = malloc ( sizeof ( struct nodo ) );                if ( ptrNuevo == NULL ){                                printf ("No hay memoria disponible \n");                        }                else {                                ptrNuevo->letra = valor;                                ptrNuevo->siguiente = NULL;                                ptrnuevoNodo ptrAnterior = NULL;                                ptrnuevoNodo ptrActual;                                ptrActual = *lista;                                while ( ptrActual->letra < valor && ptrActual != NULL ){                                                ptrAnterior = ptrActual;                                                ptrActual = ptrActual -> siguiente;                                        }                                if ( ptrAnterior == NULL ){                                                ptrNuevo->siguiente = ptrActual;                                                *lista = ptrNuevo;                                        }                                else{                                                ptrAnterior->siguiente = ptrNuevo;                                                ptrNuevo->siguiente = ptrActual;                                        }                        }        } int eliminar_letra (ptrnuevoNodo * lista, char valor){                ptrnuevoNodo ptrActual = *lista;                ptrnuevoNodo temp = NULL;                if ( ptrActual->letra == valor ){                                temp = *lista;                                *lista = (*lista) -> siguiente;                                free (temp);                                return 1;                        }                else{                                ptrnuevoNodo ptrAnterior = ptrActual;                                ptrActual = (*lista)->siguiente;                                while ( ptrActual->letra < valor && ptrActual != NULL ){                                                ptrAnterior = ptrActual;                                                ptrActual = ptrActual -> siguiente;                                        }                                ptrAnterior = ptrActual;                                        ptrActual = ptrActual->siguiente;                                ptrActual = ptrActual->siguiente;                                ptrAnterior->siguiente= ptrActual;                        }        } void menu (){                printf ( "%s%s%s%s", "Introduce 1 para ver la lista \n",                 "Introduce 2 para añadir un elmento \n",                 "Introduce 3 para eliminar un elemento \n",                "Introduce 4 para salir del programa \n");        }
Un saludo y muchas gracias de antemano.

ProfesorX:
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++ ---int main (){     int opt = 1;    char valor;    ptrnuevoNodo lista = NULL;     menu ();     while ( opt != 4 ){        printf ("? ");        scanf ("%d", &opt);        // Borrar el buffer despues de leer la opcion        while (getchar() != '\n');         switch ( opt ){        case 1:            imprimir_lista (lista);            break;        case 2:            printf ("Introduce un caracter\n");            // Usar getchar() en lugar de scanf            //scanf ("%c", &valor);            valor = getchar();            insertar_letra (&lista, valor);            imprimir_lista (lista);            break;        case 3:            printf ("Introduce un caracter\n");            scanf ("%c", &valor);            eliminar_letra (&lista, valor);            imprimir_lista (lista);            break;            // Innecesaria            //case 4:            //    break;        default:            printf ("Opcion incorrecta\n");            menu ();         } // switch    } // while} void insertar_letra (ptrnuevoNodo * lista, char valor){     ptrnuevoNodo ptrNuevo = NULL;    ptrNuevo = (struct nodo*) malloc ( sizeof ( struct nodo ) );     if ( ptrNuevo == NULL ){        printf ("No hay memoria disponible \n");    }    else {        ptrNuevo->letra = valor;        ptrNuevo->siguiente = NULL;        ptrnuevoNodo ptrAnterior = NULL;        ptrnuevoNodo ptrActual;        ptrActual = *lista;         //while ( ptrActual->letra < valor && ptrActual != NULL ){        while ( ptrActual != NULL && ptrActual->letra < valor ) {            ptrAnterior = ptrActual;            ptrActual = ptrActual -> siguiente;        }         if ( ptrAnterior == NULL ){            ptrNuevo->siguiente = ptrActual;            *lista = ptrNuevo;        }         else{            ptrAnterior->siguiente = ptrNuevo;            ptrNuevo->siguiente = ptrActual;        }    }} void eliminar_letra (ptrnuevoNodo * lista, char valor){     ptrnuevoNodo ptrActual, ptrAnterior;    ptrActual = ptrAnterior = *lista;     /* 1.- busca su posicion. Es casi igual que en la insercion, ojo al (<) */    while (ptrActual != NULL && ptrActual->letra < valor) {        ptrAnterior = ptrActual;        ptrActual = ptrActual->siguiente;    }     /* 2.- Lo borra si existe */    if (ptrActual != NULL && ptrActual->letra == valor) {        if (ptrAnterior == ptrActual)        /* borrar el primero */            *lista = ptrActual->siguiente;   /* o tambien (*L)->sig; */        else                                 /* borrar en otro sitio */            ptrAnterior->siguiente = ptrActual->siguiente;        free(ptrActual);    }} 
Saludos :)

Checho360:
Hola ProfesorX. Muchas gracias por contestar y por hacerlo de forma precisa y clara. Me ha servido de mucha ayuda!!

Navegación

[0] Índice de Mensajes

Ir a la versión completa