Listas enlazadas

Anuncio
UNIDAD 8
Tipos de datos dinámicos: Punteros
Asignación dinámica de memoria.
Uso de punteros. Inicialización y
asignación
de
punteros.
Procedimientos para asignación y
liberación de memoria. Tipos de
datos recursivos. Listas enlazadas
con punteros. Pilas. Colas.
UNIDAD 8
Estructuras Dinámicas de Datos
Estructuras cuyo tamaño (en longitud o en numero de
elementos) varia en el tiempo de ejecución.
UNIDAD 8
Lista Enlazada Simple
Cada nodo contiene un único enlace que conecta ese nodo al
nodo siguiente o nodo sucesor.
UNIDAD 8
Lista Enlazada Doble
Cada nodo contiene dos enlaces, uno a su nodo predecesor y
el otro a su nodo sucesor.
UNIDAD 8
Lista Circular Simplemente Enlazada
Una lista enlazada simplemente en la que el último elemento
se enlaza al primer elemento (cabeza) de tal modo que la lista
puede ser recorrida de modo circular.
UNIDAD 8
Lista Circular Doblemente Enlazada
Una lista doblemente enlazada en la que el ultimo elemento
se enlaza al primer elemento y viceversa. Esta lista se puede
recorrer de modo circular.
UNIDAD 8
Lista Enlazada Simple
UNIDAD 8
Lista Enlazada Simple: Definición
NODO
Colección
o
secuencia
de
elementos
dispuestos uno detrás de otro, en la que
cada elemento se conecta al siguiente
elemento por un «enlace» o «puntero»
UNIDAD 8
Lista Enlazada Simple: Nodo
- Contiene la información que
queremos almacenar en la
lista.
- Almacena un dato de
cualquier tipo.
- Es un puntero que apunta al
siguiente elemento en la
lista.
UNIDAD 8
Lista Enlazada Simple: Nodo
Vamos a representar un nodo mediante una estructura con
dos campos:
Campo valor: Para almacenar el elemento de
la lista.
Campo sgte: Puntero que permite el acceso al
siguiente elemento de la lista.
struct nodo{
tipo_de_dato valor;
struct nodo* sgte;
}
UNIDAD 8
Lista Enlazada Simple: Ejemplo
struct nodo{
Ejemplo: Lista de elementos enteros.
int valor;
struct nodo* sgte;
a) La lista tiene elementos:
};
typedef struct nodo NODO;
Necesitamos
un
puntero que indique
el inicio de la lista.
El puntero siguiente
del último elemento
debe indicar el fin de la
lista = NULL.
UNIDAD 8
Lista Enlazada Simple: Ejemplo
Ejemplo: Lista de elementos enteros.
b) La lista no tiene elementos:
struct nodo{
int valor;
struct nodo* sgte;
};
typedef struct nodo NODO;
El inicio no apunta a
nadie = NULL.
UNIDAD 8
Lista Enlazada Simple: Operaciones
Inicializar lista
Agregar un elemento en la lista
Mostrar lista
Operaciones
Lista vacía?
Cantidad de elementos de la lista
Buscar un elemento en la lista
Eliminar un elemento de la lista
Lista Enlazada Simple: Inicializar
Deseamos inicializar la lista en vacío.
main(){
Indica el inicio
de la lista
NODO* ini;
inicializar(&ini);
}
El modulo inicializar tiene un parámetro: inicio que recibe
la dirección de la variable ini.
Puntero que apunta a un NODO: NODO* inicio
inicio
Que además será modificado: NODO* *inicio
UNIDAD 8
Lista Enlazada Simple: Inicializar
RAM
ini =*inicio
NULL
inicio
101
101
El modulo debe asignar
NULL a ini, lo que equivale
a hacer *inicio=NULL.
UNIDAD 8
Lista Enlazada Simple: Agregar
Ordenada
INSERCION
Al inicio de la lista.
Al final de la lista.
Desordenada
Antes de un elemento.
Después de un elemento.
Agregar al Inicio
Deseamos insertar el elemento llamado elem en la lista
enlazada. Como las inserciones se realizaran al inicio de la
lista, la variable ini se modificara.
main(){
NODO* ini;
scanf(«%i»,&elem);
agregar(&ini, elem);
}
El modulo agregar tiene dos parámetros:
El inicio de la lista, que recibe la dirección de ini
y será modificado: NODO* *inicio;
El elemento a insertar: int e;
UNIDAD 8
Agregar al Inicio: Casos
Agregar en lista vacía:
Inicio contiene NULL
1. Gestionar espacio para almacenar un nuevo nodo.
RAM
ini =*inicio
101
NULL
*nuevo
inicio
1101
elem
101
nuevo
7
e
1101
7
UNIDAD 8
Agregar en lista vacía
1. Gestionar espacio para almacenar un nuevo nodo.
2. Asignar valores al nuevo nodo.
RAM
ini =*inicio
101
NULL
1101
*nuevo
7
inicio
NULL
elem
101
nuevo
7
e
1101
7
UNIDAD 8
Agregar en lista vacía
1. Gestionar espacio para almacenar un nuevo nodo.
2. Asignar valores al nuevo nodo.
3. Actualizar el inicio de la lista.
RAM
ini =*inicio
101
NULL 1101
1101
*nuevo
7
inicio
NULL
elem
101
nuevo
7
e
1101
7
UNIDAD 8
Agregar en lista no vacía
1. Gestionar espacio para almacenar un nuevo nodo.
RAM
100 ini =*inicio
-1
101
*nuevo
110
100
1010
1000
7
inicio
NULL
elem
101
nuevo
110
1010
1000
3
4
e
4
UNIDAD 8
Agregar en lista no vacía
1. Gestionar espacio para almacenar un nuevo nodo.
2. Asignar valores al nuevo nodo.
RAM
100 ini =*inicio
-1
101
*nuevo
4
100
1010
110
100
1000
7
inicio
NULL
elem
101
nuevo
1010
1000
3
4
e
110
4
UNIDAD 8
Agregar en lista no vacía
1. Gestionar espacio para almacenar un nuevo nodo.
2. Asignar valores al nuevo nodo.
3. Actualizar el inicio de la lista.
RAM
100 ini =*inicio
-1
101
*nuevo
4
100 110
1010
110
100
1000
7
inicio
NULL
elem
101
nuevo
1010
1000
3
4
e
110
4
UNIDAD 8
Lista Enlazada: Agregar al incio
UNIDAD 8
Lista Enlazada Simple: Agregar
Ordenada
INSERCION
Al inicio de la lista.
Al final de la lista.
Desordenada
Antes de un elemento.
Después de un elemento.
UNIDAD 8
Agregar al Final
Deseamos insertar, al final de la lista, el elemento llamado
elem. Es posible que la variable ini sea modificada.
main(){
NODO* ini;
scanf(«%i»,&elem);
agregar(& ini, elem);
}
El modulo agregar tiene dos parámetros:
El inicio de la lista, que recibe la dirección de ini
y puede ser modificado: NODO* *inicio;
El elemento a insertar: int e;
UNIDAD 8
Agregar al Final: Casos
UNIDAD 8
Agregar al Final
UNIDAD 8
Lista Enlazada Simple: Agregar
Ordenada
INSERCION
Al inicio de la lista.
Al final de la lista.
Desordenada
Antes de un elemento.
Después de un elemento.
UNIDAD 8
Agregar Ordenado
Deseamos insertar el elemento llamado elem en la lista
enlazada de manera ordenada. La variable ini podrá ser
modificada.
main(){
NODO* ini;
scanf(«%i»,&elem);
agregar(&ini, elem);
}
El modulo agregar tiene dos parámetros:
El inicio de la lista, que recibe la dirección de ini
y será modificado: NODO* *inicio;
El elemento a insertar: int e;
UNIDAD 8
Agregar Ordenado: Casos
UNIDAD 8
Agregar Ordenado: Casos
ant
NULL
i
UNIDAD 8
Agregar Ordenado: Casos
ant
i
UNIDAD 8
Agregar Ordenado: Casos
ant
i
UNIDAD 8
Agregar Ordenado: Casos
ant
i
NULL
UNIDAD 8
Agregar Ordenado: Casos
UNIDAD 8
Agregar Ordenado: Casos
UNIDAD 8
Agregar Ordenado
UNIDAD 8
Lista Enlazada: Mostrar
Deseamos mostrar los elementos de la lista enlazada, por lo
que se recorre la lista partiendo del inicio indicado por ini.
main(){
NODO* ini;
mostrar( ini);
}
El modulo mostrar tiene un parámetro:
El inicio de la lista, que recibe la dirección de
ini: NODO* inicio;
UNIDAD 8
Mostrar la lista
i = inicio;
Si (i != NULL) printf (“%i”, i->dato);
ó
Si (i != NULL) printf (“%i”, (* i). dato);
i
UNIDAD 8
Mostrar la lista
i=i->sgte;
printf (“%i”, i->dato);
Ó
i=(*i).sgte;
printf (“%i”, (* i). dato);
i
UNIDAD 8
Mostrar la lista
i=i->sgte;
printf (“%i”, i->dato);
Ó
i=(*i).sgte;
printf (“%i”, (* i). dato);
i
UNIDAD 8
Mostrar la lista
i es NULL , fin de la lista !!
i
NULL
UNIDAD 8
Lista Enlazada: Mostrar
1. Ubicarse al inicio de la lista.
RAM
100 ini =*inicio
-1
101
110
4
110
1010
100
1000
7
NULL
inicio
1010
110
3
i
110
1000
UNIDAD 8
Lista Enlazada: Mostrar
1. Ubicarse al inicio de la lista.
2. Recorrer la lista, mostrando sus elementos, hasta el final.
RAM
100 ini =*inicio
-1
101
110
4
110
1010
100
Mostrar 4
1000
7
NULL
inicio
Mostrar 3
1010
3
110
i
1010
110
NULL
1000
100
1000
Mostrar -1
Mostrar 7
UNIDAD 8
Lista Enlazada: Mostrar
UNIDAD 8
Lista Enlazada: Eliminar
Deseamos eliminar un elemento llamado elem de la lista
enlazada. Es posible que la variable ini sea modificada.
main(){
NODO* ini;
scanf(«%i»,&elem);
eliminar(& ini, elem);
}
El modulo eliminar tiene dos parámetros:
La dirección del inicio de la lista, que podrá ser
modificada: NODO* *inicio;
El elemento a eliminar: int e;
UNIDAD 8
Eliminar: Casos
NULL
UNIDAD 8
Eliminar: Casos
UNIDAD 8
Lista Enlazada: Eliminar
Descargar