MANEJO DE LISTAS ENLAZADAS Ejercicio práctico en C

Anuncio
/*---------------------------------------------------------------------------------------------------------------------------------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;
}
Descargar