You are on page 1of 12

Estructuras de Datos

Estructuras
Dinámicas de Datos

©2009 Universidad Autónoma de Nuevo León - Facultad de Ciencias Físico Matemáticas - Estructura de Datos- Nombre Autor: M.C. Virginia Valero C. 2

Agenda del día

1. Introducción

2. Listas enlazadas

©2009 Universidad Autónoma de Nuevo León - Facultad de Ciencias Físico Matemáticas - Estructura de Datos- Nombre Autor: M.C. Virginia Valero C. 3

Introducción

Las estructuras dinámicas de datos son estructuras que crecen

a medida que ejecuta un programa. Una estructura dinámica

de datos es una colección de elementos llamadas nodos . Al

contrario de un arreglo que contiene espacio para almacenar

un número fijo de elementos, una estructura dinámica de datos

se amplía y contrae durante la ejecución del programa, basada

en los registros de almacenamiento de datos del programa.

©2009 Universidad Autónoma de Nuevo León - Facultad de Ciencias Físico Matemáticas - Estructura de Datos- Nombre Autor: M.C. Virginia Valero C. 4

1
Listas Encadenadas

Si por casualidad hubiera allí


Alguien que me amara de verdad
Mi corazón me lo señalaría
Y yo te lo señalaría a ti.
Gilbert y Sullivan, Ruddigore.

©2009 Universidad Autónoma de Nuevo León - Facultad de Ciencias Físico Matemáticas - Estructura de Datos- Nombre Autor: M.C. Virginia Valero C. 5

Listas Encadenadas

Una lista enlazada o encadenada es un conjunto de elementos


en los que cada elemento contiene la posición o dirección
del siguiente elemento de la lista. Cada elemento de la
lista encadenada debe tener al menos dos campos: Un
campo que tiene el valor del elemento y un campo (enlace
o link) que contiene la posición del siguiente elemento, es
decir, su conexión, enlace o encadenamiento. Los
elementos de una lista son enlazados por medio de los
campos enlaces.

©2009 Universidad Autónoma de Nuevo León - Facultad de Ciencias Físico Matemáticas - Estructura de Datos- Nombre Autor: M.C. Virginia Valero C. 6

Listas Encadenadas

Las listas encadenadas tienen una terminología propia que se


suele utilizar normalmente. Primero, los valores se
almacenan en un nodo.

Dato Enlace
(Valor Elemento)

LISTA

5 4 1 8 9 7 4
©2009 Universidad Autónoma de Nuevo León - Facultad de Ciencias Físico Matemáticas - Estructura de Datos- Nombre Autor: M.C. Virginia Valero C. 7

2
Ejemplo

LISTA

5 4 1 8 9 7 4

Los valores se
almacenan en
un nodo.

Los componentes de un nodo se llaman


campos.
©2009 Universidad Autónoma de Nuevo León - Facultad de Ciencias Físico Matemáticas - Estructura de Datos- Nombre Autor: M.C. Virginia Valero C. 8

Listas Enlazadas

Un nodo tienen al menos un campo de dato o valor y un


enlace (indicador o puntero) con el siguiente campo. El
campo enlace apunta (proporciona la dirección de) al
siguiente nodo de la lista. El ultimo nodo de la lista
encadenada, por convenio, se suele representar por un
enlace con la palabra nil (nulo), una barra inclinada, y en
ocasiones, el símbolo eléctrico de tierra o masa.

4 4 nil 4

©2009 Universidad Autónoma de Nuevo León - Facultad de Ciencias Físico Matemáticas - Estructura de Datos- Nombre Autor: M.C. Virginia Valero C. 9

Listas Enlazadas

Una lista enlazada o encadenada es una lista que se construye


empleando apuntadores. Además, no tiene un tamaño fijo,
sino que puede crecer y decrecer durante la ejecución del
programa. Se constituyen como variables dinámicas.

En las listas enlazadas no es necesario que los elementos en


la lista sean almacenados en posiciones físicas adyacentes,
ya que el apuntador indica dónde se encuentra el siguiente
elemento de la lista.
©2009 Universidad Autónoma de Nuevo León - Facultad de Ciencias Físico Matemáticas - Estructura de Datos- Nombre Autor: M.C. Virginia Valero C. 10

3
Listas Enlazadas

Por consiguiente, la inserción y borrado no exigen


desplazamiento como en el caso de las listas contiguas.

INFO SIG
PRIMERO
INFO SIG
INFO SIG
NULO
INFO SIG

©2009 Universidad Autónoma de Nuevo León - Facultad de Ciencias Físico Matemáticas - Estructura de Datos- Nombre Autor: M.C. Virginia Valero C. 11

Listas Enlazadas

Para eliminar un elemento de una lista enlazada, solo es


necesario cambiar el puntero del elemento anterior al
elemento siguiente del que deseamos eliminar. Para
insertar un elemento en determinada posición, solo
necesitamos cambiar el apuntador de la posición anterior a
donde queremos insertar a nuestro nuevo elemento y este
elemento deberá direccionar el elemento al que
anteriormente apuntaba el elemento que quedo antes del
nuevo elemento.

©2009 Universidad Autónoma de Nuevo León - Facultad de Ciencias Físico Matemáticas - Estructura de Datos- Nombre Autor: M.C. Virginia Valero C. 12

Ejemplo

Nodo

Inicio Ana Juan Pedro

José

Eliminar a
Agregar a Juan
José

©2009 Universidad Autónoma de Nuevo León - Facultad de Ciencias Físico Matemáticas - Estructura de Datos- Nombre Autor: M.C. Virginia Valero C. 13

4
Listas Enlazadas

Una lista enlazada sin ningún elemento se llama lista vacía. Su


puntero inicial o de cabecera tiene el valor nulo (nil).

Una lista enlazada se puede definir por:


 El tipo de sus elementos: campo de información (datos) y campo
enlace (puntero).
 Un puntero de cabecera que permite acceder al primer elemento
de la lista.
 Un medio para detectar el ultimo elemento de la lista: puntero
nulo (nil).

©2009 Universidad Autónoma de Nuevo León - Facultad de Ciencias Físico Matemáticas - Estructura de Datos- Nombre Autor: M.C. Virginia Valero C. 14

Listas Enlazadas
Ejemplo
El director de un hotel desea registrar el nombre de cada cliente a medida
de su llegada al hotel junto con el número de habitación que ocupa (el
antiguo libro de entradas). También desea disponer en cualquier
momento de una lista de sus clientes por orden alfabético.

Ya que no es posible registrar los clientes alfabéticamente y


cronológicamente en la misma lista, se necesita o bien dos listas
alfabéticas independientes o bien añadir punteros a la lista existente,
con lo que sólo se utilizará una única lista. El método manual en el
libro requería muchos cruces y re-escrituras; sin embargo, una
computadora mediante el algoritmo adecuado lo realizará fácilmente.

Por cada nodo de la lista el campo de información o datos tiene dos


partes: nombre del cliente y número de habitación. Si x es un puntero
a uno de estos nodos, l[x].nombre y l[x].habitación representaran dos
partes del campo información.
©2009 Universidad Autónoma de Nuevo León - Facultad de Ciencias Físico Matemáticas - Estructura de Datos- Nombre Autor: M.C. Virginia Valero C. 15

Listas Enlazadas
Ejemplo
El listado alfabético se consigue siguiendo el orden de los punteros de la
lista (campo puntero). Se utiliza una variable CABECERA para apuntar
al primer cliente.

CABECERA  3

Así cabecera es 3, ya que el primer cliente, Antolin, ocupa el lugar 3. A su


vez, el puntero asociado al nodo ocupado por Antolin contiene el valor
10, que es el segundo nombre de los clientes en orden alfabético, y
éste tiene como campo puntero el valor 7, y así sucesivamente. El
campo puntero del último cliente, Tomas, contiene el puntero nulo
indicado por un 0.

©2009 Universidad Autónoma de Nuevo León - Facultad de Ciencias Físico Matemáticas - Estructura de Datos- Nombre Autor: M.C. Virginia Valero C. 16

5
Listas Enlazadas
Ejemplo
Registro Nombre Habitación Puntero
1 Tomás 324 0(final)
Cabecera 2 Cazorla 28 8
 3 Antolin 96 10
4 Pérez 462 6
5 López 260 12
6 Sánchez 220 1
7 Bautista 115 2
8 García 105 9
9 Jiménez 173 5
10 Apolinar 341 7
11 Martín 205 4
12 Luzárraga 420 11
.
.
.
©2009 Universidad Autónoma de Nuevo León - Facultad de Ciencias Físico Matemáticas - Estructura de Datos- Nombre Autor: M.C. Virginia Valero C. 17

Listas Enlazadas

Las operaciones que hay que realizar con una lista


enlazada son:
1. Definir y crear los nodos.
2. Definir la cabecera (o inicio) de la lista.
3. Recorrer los nodos de una lista enlazada.
4. Agregar un nodo a la lista.
 Al final.
 Al Principio.
 En el centro.
5. Eliminar un nodo de la lista.
 Al final.
 Al Principio.
 En el centro.
©2009 Universidad Autónoma de Nuevo León - Facultad de Ciencias Físico Matemáticas - Estructura de Datos- Nombre Autor: M.C. Virginia Valero C. 18

¿Cómo creamos el nodo?

struct NODO
{
char nombre[10];
struct nodo *siguiente;
};

Sin embargo con esto solo la definimos y no


declaramos la variable aun.

©2009 Universidad Autónoma de Nuevo León - Facultad de Ciencias Físico Matemáticas - Estructura de Datos- Nombre Autor: M.C. Virginia Valero C. 19

6
¿Cómo creamos un nodo?

Debemos pedir la memoria y asignársela


a una variable puntero a ese nodo.
struct NODO *nodo;
nodo=(struct NODO *) malloc (sizeof (struct
NODO));
nodo

Finalmente se le agregan datos:


gets(nodonombre);
nodo José
nodosiguiente=NULL;
©2009 Universidad Autónoma de Nuevo León - Facultad de Ciencias Físico Matemáticas - Estructura de Datos- Nombre Autor: M.C. Virginia Valero C. 20

El inicio de la lista

Para esto se debe declarar un puntero a la


estructura de la siguiente forma:
struct NODO *Lista=NULL;

Lista

©2009 Universidad Autónoma de Nuevo León - Facultad de Ciencias Físico Matemáticas - Estructura de Datos- Nombre Autor: M.C. Virginia Valero C. 21

¿Cómo agregamos un nodo?

Esta operación depende de varios factores:

1. Si la lista esta vacía.

2. Si la lista no esta vacía:


 Si agregamos al inicio.

 Si agregamos en el centro.

 Si agregamos al final.

©2009 Universidad Autónoma de Nuevo León - Facultad de Ciencias Físico Matemáticas - Estructura de Datos- Nombre Autor: M.C. Virginia Valero C. 22

7
Agregar un nodo, si la lista esta vacia.

Lista

En este caso el puntero de inicio apunta a null,


así que para agregarlo solo debemos cambiar
este puntero.

Lista=nodo;

Lista José

©2009 Universidad Autónoma de Nuevo León - Facultad de Ciencias Físico Matemáticas - Estructura de Datos- Nombre Autor: M.C. Virginia Valero C. 23

Agregar un nodo al inicio

Lista José nodo Ana

En este caso hay que mover dos


punteros, Lista debe apuntar a nodo y
nodo a donde apuntaba lista.
nodosiguiente=Lista;
Lista José
Lista=nodo;

Ana

©2009 Universidad Autónoma de Nuevo León - Facultad de Ciencias Físico Matemáticas - Estructura de Datos- Nombre Autor: M.C. Virginia Valero C. 24

Agregar un nodo al Final

Lista Ana José


nodo Mario
En este caso hay que recorrer la lista hasta el final, y hacer que
el ultimo nodo apunte al nuevo. Para recorrer la lista
necesitamos un puntero.
struct NODO *elemento;
elemento=Lista;
while(elementosiguiente!=NULL)
elemento=elementosiguiente; nodo
elementosiguiente=nodo;

Lista Ana José Mario


elemento
©2009 Universidad Autónoma de Nuevo León - Facultad de Ciencias Físico Matemáticas - Estructura de Datos- Nombre Autor: M.C. Virginia Valero C. 25

8
Ejemplo

Definir y crear los nodos.


Struct Nodo
{
//definir los datos necesarios.
//DEFINIR UN NOMBRE PARA EL EJEMPLO.
Struct Nodo *siguiente;
};

Definir la cabecera (o inicio) de la lista.


Struct Nodo *primero;

©2009 Universidad Autónoma de Nuevo León - Facultad de Ciencias Físico Matemáticas - Estructura de Datos- Nombre Autor: M.C. Virginia Valero C. 26

Ejemplo

Recorrer los nodos de una lista enlazada.


Función para saber cuantos elementos tiene una lista enlazada.
Int recorrer()
{
struct Nodo *elemento=primero;
int contador=0;
while(elemento!=NULL);
{
elemento=elemento siguiente;
contador++;
}
return contador;
}
©2009 Universidad Autónoma de Nuevo León - Facultad de Ciencias Físico Matemáticas - Estructura de Datos- Nombre Autor: M.C. Virginia Valero C. 27

Ejemplo

Agregar un nodo a la lista. (Al final)


Void agrega_final(char s[ ])
{
struct Nodo *elemento=primero;
if(primero==NULL) //La lista esta vacia.
{ //creo el nodo
primero=(struct Nodo *) malloc (sizeof(struct Nodo));
Strcpy(primerodato, s); //copio el contenido.
}
else
{ //recorro la lista hasta un elemento antes del final.
While(elementosiguiente!=NULL) elemento=elementosiguiente;
//creo un nuevo eslabon.
esiguiente=(struct Nodo *) malloc (sizeof(struct Nodo));
Strcpy(elementosiguientedato,s);
}
} ©2009 Universidad Autónoma de Nuevo León - Facultad de Ciencias Físico Matemáticas - Estructura de Datos- Nombre Autor: M.C. Virginia Valero C. 28

9
Ejemplo

Eliminar un nodo de la lista. While(elementosiguiente!=NULL &&


strcmp(elementosiguientedato,clav
Void eliminar(char clave[])
e)!=0)
{
elemento=elementosiguiente;
struct Nodo *elemento=primero;
struct Nodo *liberar;
//puedo estar al final de la lista o bien
//si es el primer elemento de la lista. un elemento antes del que quiero
If(strcmp(primeros, clave)==0) eliminar.
{ If(elementosiguiente==NULL)
liberar=primero; return;
primero=primerosiguiente;
free(liberar); Liberar=elementosiguiente;
} elementosiguiente=elementosiguie
else ntesiguiente;
{ //recorro la lista hasta situarme free(liberar);
un elemento antes del que quiero }//fin Else
eliminar. }
©2009 Universidad Autónoma de Nuevo León - Facultad de Ciencias Físico Matemáticas - Estructura de Datos- Nombre Autor: M.C. Virginia Valero C. 29

Tarea

1. Implementar una lista enlazada con todas sus


funciones asegurándose que se mantenga
ordenada de acuerdo a la clave proporcionada
por el usuario.

2. Implementar una lista enlazada que funcione


como pila.

3. Implementar una lista enlazada que funcione


como cola.
©2009 Universidad Autónoma de Nuevo León - Facultad de Ciencias Físico Matemáticas - Estructura de Datos- Nombre Autor: M.C. Virginia Valero C. 30

Listas doblemente enlazadas

Hasta ahora hemos podido crear soluciones que


consideren el recorrido de una lista de inicio a
fin, pero en caso que necesitemos recorrerla de
fin a inicio no es posible, tampoco es posible
regresarnos un lugar desde el nodo que estamos.

¿Qué cambios deberíamos hacer para poder


satisfacer las necesidades presentadas?

©2009 Universidad Autónoma de Nuevo León - Facultad de Ciencias Físico Matemáticas - Estructura de Datos- Nombre Autor: M.C. Virginia Valero C. 31

10
Listas doblemente enlazadas

Las listas doblemente enlazadas nos permiten


poder recorrer la lista en cualquier dirección.

El primer cambio que debemos hacer será respecto


a la definición del nodo, dado que ahora también
será necesario establecer el nodo anterior.
ANT INFO SIG

©2009 Universidad Autónoma de Nuevo León - Facultad de Ciencias Físico Matemáticas - Estructura de Datos- Nombre Autor: M.C. Virginia Valero C. 32

Listas doblemente enlazadas

En general la lista se verá como la siguiente:


ANT INFO SIG ANT INFO SIG
PRIMERO
NULO

ANT INFO SIG

©2009 Universidad Autónoma de Nuevo León - Facultad de Ciencias Físico Matemáticas - Estructura de Datos- Nombre Autor: M.C. Virginia Valero C. 33

Listas Circulares

Con las listas doblemente enlazadas tenemos la


posibilidad de recorrer la lista en ambos sentido,
pero una vez que llegamos al final, tenemos que
recorrer toda la lista para poder volver al inicio.

¿Qué cambios deberíamos hacer para poder ir


desde el fin al inicio en un solo paso?

©2009 Universidad Autónoma de Nuevo León - Facultad de Ciencias Físico Matemáticas - Estructura de Datos- Nombre Autor: M.C. Virginia Valero C. 34

11
Listas Circulares

Las listas circulares nos permiten poder tener una


conexión entre el nodo final y el inicio, en otras
palabras, no tienen final. Y la podemos recorrer
tantas veces así sea necesario.

INFO SIG INFO SIG INFO SIG


PRIMERO
Nulo

©2009 Universidad Autónoma de Nuevo León - Facultad de Ciencias Físico Matemáticas - Estructura de Datos- Nombre Autor: M.C. Virginia Valero C. 35

Listas Circulares

A pesar de que estas listas simplifican las


operaciones sobre ellas, también introducen
algunas complicaciones. Por ejemplo, en un
proceso de búsqueda, no es tan sencillo dar por
terminada la búsqueda cuando el elemento
buscado no existe.

©2009 Universidad Autónoma de Nuevo León - Facultad de Ciencias Físico Matemáticas - Estructura de Datos- Nombre Autor: M.C. Virginia Valero C. 36

Tarea

1. Implemente una lista doblemente enlazada.

2. Implemente una lista circular.

En ambos casos deberá poder agregar y eliminar


elementos cuidando el orden de los mismos.

©2009 Universidad Autónoma de Nuevo León - Facultad de Ciencias Físico Matemáticas - Estructura de Datos- Nombre Autor: M.C. Virginia Valero C. 37

12

You might also like