#include <stdio.h> #include <stdlib.h>
struct lista_nodos { /*Se declara una estructura*/ char valor; struct lista_nodos *sigPtr; }; typedef struct lista_nodos LISTA; typedef struct lista_nodos *LISTPREVPTR; /*Se usa un alias para la estructura lista_nodos*/ void inserta(LISTPREVPTR*, char); /*Se declara la función inserta*/ char elimina (LISTPREVPTR*, char); /*Se declara la función elimina*/ int estavacia (LISTPREVPTR); /*Se declara la función estavacia*/ void imprime (LISTPREVPTR); /*Se declara la función imprime*/ void menu (void); /*Se declara la funcion menu*/ main(){ LISTPREVPTR inicioPtr = NULL; int avanza, selec; char dato; printf("\n\n%s\n\n","<Un programa que construye listas dinamicas>"); menu(); /*Se manda llamar a la función menu*/ printf("\n%s","\n\nLa opción seleccionada es: "); scanf("%d",&selec); /*Se lee la función que elige el usuario*/ while(selec != 3){ /*Cuando la opción elegida por el usuario sea distinta de 1, 2 o 3 se despliega nuevamente el menu*/ switch(selec){ /*Se definen las acciones a realizar conforme a la opción que elija el usuario*/ case 1: printf("\n%s","Deme un caracter: "); scanf("\n%c", &dato); inserta(&inicioPtr, dato); /*Se manda llamar a la funcón inserta*/ imprime(inicioPtr); /*Se manda llamar a la función inicio*/ break; case 2: if(!estavacia(inicioPtr)){ printf("\n%s","El caracter a eliminar es: "); scanf("\n%c",&dato); if(elimina(&inicioPtr, dato)){ /*Se manda llamar a la función elimina*/ printf("\n%s%c%s\n\a\a","El caracter: ",dato,"fue eliminado de la lista"); imprime(inicioPtr); /*Se manda llamar a la función imprime*/ } else /*En caso de no encontrarse el caracter se entra al else*/ printf("\n%s%c%s\n\a","El caracter: ",dato,"no fue encontrado en la lista"); } else /*La ultima opcion que puede ocurrir al momento de eliminar un carcter se presenta en este else*/ printf("\a\n\t%s\n\a","La lista esta vacia"); break; default: /*En caso de no ocurrir nada de lo anterior se lanzara en pantalla lo siguiente*/ printf("\n%s\n","La selección es incorrecta"); menu(); /*Se despliega el menu*/ break; } menu(); printf("\n%s","La opcion seleccionada es: "); scanf("%d", &selec); }; printf("\n\n%s","Hasta pronto"); scanf("%d",&avanza); return 0; } void menu(void){ /*Se define la función menu*/ printf("\n\nSeleccione una opcion: "); printf("\n\n1.-Insertar un elemento en la lista"); printf("\n\n2.-Eliminar un elemento en la lista"); printf("\n\n3.-Salir del programa"); } void inserta(LISTPREVPTR*aPtr, char datoin){ /*Se define la función inserta*/ LISTPREVPTR datnvoPtr, datprevPtr, datactPtr, lista_nodos; /*Se declaran apuntadores que sean del tipo LISTPREVPTR*/ datnvoPtr=(LISTPREVPTR)malloc(sizeof(lista_nodos)); /*evalúa a sizeof (lista_nodos) para determinar el tamaño de una estructura del tipo lista_nodos, para asignar una nueva área en memoria, y para almacenar un apuntador a la memoria asignada a la variable datnvoPtr */ if(datnvoPtr != NULL){ /*En caso de que datnvoPtr sea distinto de NULL, se realizara lo siguiente*/ datnvoPtr->valor=datoin; datnvoPtr->sigPtr=NULL; datprevPtr=NULL; datactPtr=*aPtr; while(datactPtr != NULL&&datoin>datactPtr->valor){ datprevPtr=datactPtr; datactPtr=datactPtr->sigPtr; }; if(datprevPtr==NULL){ /*Se compara datprevPtr con NULL y se continuara si son iguales*/ datnvoPtr->sigPtr=*aPtr; *aPtr=datnvoPtr; } else{ /*Si datprevPtr es distinto de NULL se entrara al else*/ datprevPtr->sigPtr=datnvoPtr; datprevPtr->sigPtr=datactPtr; } } else /*En caso de no haber ocurrido ninguna de las anteriores se entrara a este else*/ printf("\n%s%c%s\n%s\a\a\a\a","El caracter: ",datoin,"no fue insertado", "memoria insuficiente\n\n"); } char elimina(LISTPREVPTR*bPtr, char datoele){ /*Se define la función elimina*/ LISTPREVPTR datempPtr, datprevPtr, datactPtr; /*Se declaran apuntadores que sean dell tipo LISTPREVPTR*/ if(datoele==(*bPtr)->valor){ datempPtr=*bPtr; *bPtr=(*bPtr)->sigPtr; free(datempPtr); /*Se liberara memoria de datempPtr*/ return datoele; } else{ datprevPtr=*bPtr; datactPtr=(*bPtr)->sigPtr; while(datactPtr!=NULL&&datactPtr->valor!=datoele){ datprevPtr=datactPtr; datactPtr=datactPtr->sigPtr; }; if(datactPtr!=NULL){ datempPtr=datactPtr; datprevPtr->sigPtr=datactPtr->sigPtr; free(datempPtr); /*Se liberara memoria de datempPtr*/ return datoele; } } return '\0'; } int estavacia(LISTPREVPTR cPtr){ /*Se define la función estavacia*/ return(cPtr==NULL); } void imprime(LISTPREVPTR dPtr){ /*Se define la función imprime*/ if(dPtr==NULL){ /*En casao de que dPtr no este inicializado se imprimira lo de abajo*/ printf("\a\n\t%s","La lista esta vacia\n\n"); printf("NULL \n\n"); } else{ /*Cuando dPtr tenga valor se mostrara la lista*/ printf("\n\t%s","La lista es: "); while(dPtr!=NULL){ /*Solo cuando dPtr sea distitno de NULL se hara la impresión que aparece abajo*/ printf("%c--->",dPtr->valor); dPtr=dPtr->sigPtr; } printf("\n"); } } |