/*---------------------------------------------------------------------------------------------------------------------------------MANEJO DE LISTAS ENLAZADAS ESTE PROGRAMA IMPLEMENTA EL MANEJO DE UNA LISTA UTILIZANDO APUNTADORES -----------------------------------------------------------------------------------------------------------------------------------*/ /* La directiva #include se usa para incluir un conjunto de funciones que se encuentran en librerías */ #include <stdio.h> //Manejo de las operaciones de lectura y escritura (input/output) #include <stdlib.h> //Uso de memoria dinámica : malloc, null, etc /* Declaración del regsitro lista_enlazada con la información de cada nodo de la lista */ struct lista_enlazada { int valor; struct lista_enlazada *prox; }; /* dato entero del nodo */ /* apuntador al próximo nodo */ /* Definición de "nodo" como sinónimo de la estructura "lista enlazada" */ typedef struct lista_enlazada nodo; nodo *primero = NULL; //apuntador al inicio de la lista /* Declaraciones de prototipos de las funciones que se usarán en el programa */ char menu(); void ejecutar (char opcion); nodo *insertar_final(int clave,nodo *apuntador); void insertar_inicio(int clave,nodo **apuntador); nodo *borrar(int clave,nodo *apuntador); nodo *eliminar_todo(nodo *apuntador); void listar (nodo *apuntador); nodo *consultar(int clave, nodo *apuntador); nodo *ultimo(nodo *apuntador); // Realiza el menú del programa //Ejecuta la opción seleccionada en el menú //Inserta un elemento al final de la lista //Inserta un elemento al principio de la lista //Borra un elemento en la lista //Elimina toda la lista //Muestra los elementos de la lista //Consulta un elemento e indica posición //Devuelve el ultimo nodo de la lista /* Función main() : Es la función principal del programa. Será la función main() la que haga las diferentes llamadas a las otras funciones*/ int main() { char opcion; do { system("cls"); opcion = menu(); ejecutar (opcion); } while (opcion != 'F'); /*fin del do-while*/ system("PAUSE"); return (0); } /*fin del main*/ /* FUNCIONES DEL PROGRAMA */ /* Función menu() : Permite generar el menu del sistema */ char menu() { char opcion; system("cls"); system("cls"); printf(" M E N U P R I N C I P A L \n"); printf("I INSERTAR UN ELEMENTO AL FINAL DE LA LISTA\n"); printf("P INSERTAR UN ELEMENTO AL PRINCIPIO DE LA LISTA\n"); printf("C CONSULTAR UN ELEMENTO DE LA LISTA\n"); printf("B BORRAR UN ELEMENTO DE LA LISTA\n"); printf("E ELIMINAR LA LISTA COMPLETA\n"); printf("M MOSTRAR LA LISTA\n"); printf("F.- FIN\n"); printf("Indica la opcion de tu preferencia -> "); scanf("%c",&opcion); fflush(stdin); return(opcion); } /*fin de menu*/ /* Ejecuta la opción seleccionada en el Menú del programa */ void ejecutar (char opcion) { int clave; char confirma; nodo *aux; switch(opcion) { case 'I': printf("Introduzca el elemento a insertar = "); scanf("%d",&clave); fflush(stdin); primero = insertar_final(clave,primero); listar(primero); break; case 'P': printf("Introduzca el elemento a insertar = "); scanf("%d",&clave); fflush(stdin); insertar_inicio(clave,&primero); //se pasa primero por referencia listar(primero); break; case 'C': printf("Introduzca el elemento a consultar = "); scanf("%d",&clave); fflush(stdin); listar(primero); printf ("\n"); aux = consultar(clave,primero); break; case 'B': printf("Introduzca el elemento a borrar = "); scanf("%d",&clave); fflush(stdin); primero = borrar(clave,primero); listar(primero); break; case 'E': printf("Seguro que quieres eliminar toda la lista? (S o N) = "); scanf("%c",&confirma); fflush(stdin); if (confirma = 'S') primero = eliminar_todo(primero); listar(primero); break; case 'M': listar(primero); break; case 'F': /*finalizar las operaciones*/ printf("FIN de las operaciones\n"); break; default: printf("OPCION INVALIDA\n"); system("PAUSE"); } /*fin del switch*/ return; } /*fin de ejecutar*/ /*Función *ultimo(nodo *apuntador) : Esta función devuelve un apuntador al final de la lista */ nodo *ultimo(nodo *apuntador) { nodo *aux; aux = apuntador; while (aux->prox != NULL) { aux = aux->prox; } return aux; } /*fin de ultimo*/ /* Función *insertar_final (int clave,nodo *apuntador) Permite insertar al final de la lista Se contemplan dos casos: - Si la lista está vacía, se crea un nodo y se le asigna "primero". - Si la lista tiene al menos un elemento, se ubica el nodo final, se crea el nodo y se "enlaza" al último. */ nodo *insertar_final(int clave,nodo *apuntador) { nodo *nuevo; nodo *aux; if (apuntador == NULL) /*la lista está vacía*/ { nuevo = (nodo *)malloc(sizeof(nodo)); nuevo->valor = clave; nuevo->prox = NULL; apuntador = nuevo; } else { aux = ultimo(apuntador); //devuelve el nodo final nuevo = (nodo *)malloc(sizeof(nodo)); nuevo->valor = clave; nuevo->prox = NULL; aux->prox = nuevo; } /*fin del else*/ return (apuntador); } /*fin de insertar al final*/ /* Función *insertar_inicio (int clave,nodo *apuntador) Permite insertar al final de la lista. Esto es más sencillo que al final. Se crea el nodo, se enlaza al "principio" y este nuevo nodo pasa a ser el "principio”. En este ejemplo, se pasa “primero” como variable por referencia, a diferencia de Insertar_final que se trabaja como una función que devuelve el apuntador */ void insertar_inicio(int clave, nodo **apuntador) { nodo *nuevo; nodo *aux; nuevo = (nodo*)malloc(sizeof(nodo)); nuevo->valor = clave; nuevo->prox = *apuntador; *apuntador = nuevo; } /*fin de insertar al inicio*/ /* Función *borrar(int clave,nodo *apuntador) : Elimina un elemento de la lista. */ nodo *borrar(int clave,nodo *apuntador) { nodo *ant, *aux; /* Se busca clave en la lista */ ant = consultar (clave,apuntador); /* Si se encontró el elemento en la lista, éste se borra */ if (ant != NULL) { aux = ant->prox; ant->prox = ant->prox->prox; free(aux); } else { if (apuntador != NULL) //se está eliminando el primer nodo de la lista { aux = apuntador; apuntador = apuntador->prox; free(aux); } } return (apuntador); } /*fin de borrar*/ /* Función listar(nodo *apuntador) : Permite imprimir el contenido de la lista, recorriendo uno a uno los nodos */ void listar(nodo *apuntador) { nodo *aux; system("cls"); printf("PRIMERO -> "); aux = apuntador; while (aux != NULL) { printf("%d -> ",aux->valor); aux = aux->prox; } printf("NULL\n"); system("PAUSE"); return; } /*fin de mostrar*/ /* Función consultar (int clave,nodo *apuntador) : Busca "clave" en la lista e imprime la posición donde está Adicionalmente devuelve el apuntador del nodo anterior, útil para la rutina borrar*/ nodo *consultar(int clave,nodo *apuntador) { nodo *aux, *anterior; int posi = 1; aux = apuntador; anterior = NULL; if (aux == NULL) printf("%LA LISTA ESTA VACIA\n"); else { /* Se recorre la lista desde el principio */ while ((aux->prox != NULL) && (aux->valor != clave)) { anterior = aux; aux = aux->prox; posi++; } if (aux->prox == NULL) printf("%d NO SE ENCUENTRA EN LA LISTA\n", clave); else printf("%d ESTA EN LA LISTA EN LA POSICION %d \n", clave, posi); } system("PAUSE"); return(anterior); } /*fin de buscar*/ /* Función *eliminar_todo(nodo *apuntador) : Esta función permite liberar la memoria de los apuntadores, destruyendo la lista */ nodo *eliminar_todo(nodo *apuntador) { nodo *p,*q; p = apuntador; while (p != NULL) { q = p; p = p->prox; free(q); } return p; }