#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NILL 0
 
struct lista_elementos {
    char carac[40];
    struct lista_elementos *sig;
    struct lista_elementos *ant;
};
typedef struct lista_elementos nodo;
int menu (void);
nodo *crear (nodo *pt);
nodo *buscar_palabra (nodo *lista);
nodo *borrar_palabra (nodo *lista,nodo *primero);
void mostrar_lista (nodo *lista);
main () {
    nodo *lista;
    nodo *primero;
    int eleccion;
    do {
        eleccion = menu();
        switch (eleccion) {
            case 1 : //crear la lista doblemente enlazada
                lista = (nodo *) malloc (sizeof(nodo)); //reserva el espacio para el primer nodo
                crear(lista);
                break;
            case 2 : //muestra la lista
                mostrar_lista(lista);
                break;
            case 3 : //borra el componente que corresponde a la palabra
                lista = borrar_palabra(lista,primero);
                break;
            default: //finalizar
                printf("Fin de las operacionesn");
        }
    } while (eleccion != 4);
}
 
int menu(void) {
    int eleccion;
    do {
        printf("nMenu principaln");
        printf("1. Crea la lista doblemente enlazadan");
        printf("2. Muestra la listan");
        printf("3. Borra el componente que corresponde a la palabra buscadan");
        printf("Elija la opcionn: ");
        scanf("%d",&eleccion);
        setbuf(stdin,NULL);
        if (eleccion<1 || eleccion>4) {
            printf("n El valor introducido no se corresponde con ninguna");
            printf("nde las posibilidades del menu. Intentelo de nuevo n");
        }
    } while (eleccion<1 || eleccion>4);
    return(eleccion);
}
 
nodo *crear (nodo *lista) {
    printf("Introduce la palabra que quieres meter en la lista(para terminar FIN)n: ");
    setbuf(stdin,NULL);
    scanf("%[^n]",lista->carac);
    if (strcmp (lista->carac,"FIN") == 0) {
        lista->sig=NULL;
        lista->ant=NULL;
    }
    else {
        lista->sig=(nodo *) malloc (sizeof(nodo));
        crear(lista->sig);
    }
return(lista);
}
 
nodo *borrar_palabra (nodo *lista,nodo *primero) {
    primero = buscar_palabra(lista);
    if (primero != NULL) {
        if (primero->sig == NULL) {
            primero->ant->sig=NULL;
            free(primero);
        }
        else {
            if (primero == lista) {
                lista=primero->sig;
                free(primero);
            }
            else {
                primero->ant=primero->sig;
                free(primero);
            }
        }
    }
    else
        printf("No hay nada que borrarn");
    return(lista);
}
 
nodo *buscar_palabra (nodo *lista) {
    nodo *primero;
    char palabra[40];
    printf("Introduce la palabra que quieres que busque el programa: ");
    scanf("%[^n]",palabra);
    primero=lista;
    while (primero != NULL) {
        if (strcmp(primero->carac,palabra) != 0) {
            primero=primero->sig;
            return(NULL);
        }
        else {
            printf("Palabra encontradan");
            return(primero);
        }
    }
}
 
void mostrar_lista (nodo *lista) {
    if (lista->sig != NULL) {
        printf("%sn",lista->carac);
        mostrar_lista(lista->sig);
    }
}