Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
UNIDAD ZACATENCO
ASIGNATURA:
ESTRUCTURAS Y BASES DE DATOS
PROFESORA:
CORTES HERNANDEZ LILIA
ALUMNOS:
JUAREZ PEREZ MIGUEL
RAMIREZ TOFOLLA JOSUE
GRUPO:
3CV4
“LISTAS ENLAZADAS”
Listas enlazadas
1. Introducción
2. Memoria dinámica
2.1 Malloc y free
3. ¿En qué consisten las listas enlazadas?
3.1. Ejercicios
4. Paso de punteros a funciones
4.1 Paso por valor
4.2. Paso por referencia
5. Liberar la memoria de una lista enlazada
6. Solución a los ejercicios
6.1. Ejercicio de números primos
7. Eliminar un elemento de una lista enlazada
7.1. Suprimir por cabeza
7.2. Suprimir por el final
7.3. Eliminación de un elemento cualquiera de una lista enlazada
8. Ventajas y desventajas de las listas enlazadas respecto a los arrays
9. Acabando
Introducción
En esta segunda entrega vamos a ver lo que son las listas enlazadas y para
ello trataremos la memoria dinámica. Es un tema muy utilizado en la práctica.
Antes de empezar hago una pequeña aclaración que seguramente es
innecesaria:
Arrays = tabla = vector (si es de una dimensión)
Tupla = estructura = record
Lo dejo claro desde el principio por si os encontráis con alguna de estos
términos, aunque intentaré no mezclarlos para no liar al personal.
Memoria dinámica
Malloc y free
Estas dos funciones nos servirán para asignar dinámicamente memoria. Estas
2 funciones se encuentran en la librería <alloc.h>
#include <stdio.h>
#include <alloc.h>
void main()
{
unsigned long int bytes;
char *texto;
Aquí entran en juego varios temas, se trata de combinar las estructuras con los
punteros para acabar por fin con la limitación de los arrays, ya no hará falta
indicar el tamaño del array al principio. Después comentaremos los pros y los
contras de las listas enlazas respecto a los arrays.
Las listas enlazadas pueden ser simples, dobles o circulares. De momento
veremos las simples. Estas listas tendrán una estructura como la de la figura:
STRUCT _AGENDA {
CHAR NOMBRE [20];
CHAR TELEFONO [12];
STRUCT _AGENDA * SIGUIENTE ;
};
void mostrar_menu();
void anadir_elemento();
void mostrar_lista();
void main() {
char opcion;
void mostrar_menu() {
printf("\n\nMenú:\n=====\n\n");
printf("1.- Añadir elementos\n");
printf("2.- Borrar elementos\n");
printf("3.- Mostrar lista\n");
printf("4.- Salir\n\n");
printf("Escoge una opción: ");fflush(stdin);
}
void mostrar_lista() {
_agenda *auxiliar; /* lo usamos para recorrer la lista */
int i;
i=0;
auxiliar = primero;
printf("\nMostrando la lista completa:\n");
while (auxiliar!=NULL) {
printf( "Nombre: %s, Teléfono: %s\n",
auxiliar->nombre,auxiliar->telefono);
auxiliar = auxiliar->siguiente;
i++;
}
if (i==0) printf( "\nLa lista está vacía!!\n" );
}
Ejercicios:
1-Crear la función eliminar un elemento de la lista enlazada.
2-Crear un programa para calcular números primos y almacenarlos en una lista
enlazada y de esta forma poder seguir calculando números hasta que
queramos. Podéis utilizar la función kbhit() (esta función no es ANSI C, C
estándar) que nos devuelve cierto cuando pulsamos una tecla. Así podemos
calcular números primos hasta que pulsemos una tecla. Si no queréis utilizar
kbhit() podéis calcular números primos hasta un cierto número.
#INCLUDE <STDIO.H>
VOID CAMBIA ( INT * P );
VOID MAIN ()
{
INT I = 10;
INT *P;
P = &I;
En este ejemplo vemos que el paso por valor lo hacemos igual que hasta
ahora, hay que tener en cuenta que en la definición de la función ponemos int
*p porque este es el tipo de variable.
#INCLUDE <STDIO.H>
VOID CAMBIA ( INT ** P );
VOID MAIN ()
{
INT I = 10;
INT *P;
P = &I;
VOID LIBERAR ()
{
PRIMOS *AUX , *ANT ;
ANT = PRIMERO;
FOR (AUX = PRIMERO -> SIGUIENTE ; AUX != NULL; AUX = AUX -> SIGUIENTE )
{
FREE ( ANT );
ANT = AUX ;
}
}
Vemos en el ejemplo que no basta sólo con una variable auxiliar, hemos
utilizado aux y ant ya que si liberamos aux ya no podremos pasar al siguiente
elemento.
Es muy recomendable liberar la memoria cuando ya no la necesitemos.
Bueno, después de haber visto las listas enlazadas no debemos pensar que
son siempre mejores que los arrays, depende para que los vayamos a utilizar.
Ventajas de las listas enlazadas respecto a los arrays
1. Tamaño dinámico. Lo que implica optimización de la memoria.
Desventajas de las listas enlazadas respecto a los arrays
1. El acceso es secuencial (para llegar a una posición deberemos pasar
por todas las anteriores). Esto significa lentitud. Imaginad por un
momento el tinglado que tendríamos que montar para ordenar una lista
enlazada. Si buscamos un elemento de una lista ordenada también
tardaremos más, no vale la búsqueda dicotómica que vimos en la
Ampliación 1 de C (métodos de clasificación en memoria dinámica).
2. El código se complica.