You are on page 1of 33

Estructura de Datos

Sesion 2

Estructura de Datos
Dinmicas
Lineales
Listas Enlazadas Simples
Listas Doblemente
Enlazadas
Listas Circulares
Colas
Pilas

Estructuras Dinmicas
Las estructuras dinmicas nos
permiten crear estructuras de datos
que se adapten a las necesidades
reales a las que suelen enfrentarse
nuestros programas.
Nos permiten crear estructuras de
datos muy flexibles, ya sea en
cuanto al orden, la estructura interna
o las relaciones entre los elementos
que las componen.

Qu es una lista?
Una lista es unaestructura de datosque nos permite agrupar elementos de una
manera organizada. Las listas al igual que los algoritmos son importantsimas
en la computacin y crticas en muchos programas informticos.
Una lista enlazada es un conjunto de elementos llamados nodos en los que cada
uno de ellos contiene un dato y tambin la direccin del siguiente nodo.
El orden de los mismos se establece mediante punteros.
Cada componente de lalista debe incluir un puntero que indique donde puede
encontrarse el siguiente componente por loqueel orden relativo deestos
puede ser fcilmente alterado modificando los punteros loquepermite, a su
vez, aadir o suprimir elementos de lalista.
El primer elemento de la lista es la cabecera, que slo contiene un puntero que
seala el primer elemento de la lista.
El ltimo nodo de la lista apunta a NULL (nulo) porque no hay ms nodos en la
lista.
Se usar el trmino NULL para designar el final de la lista.

DATO

ENLACE

LISTAS ENLAZADAS
Una lista enlazada o encadenada es una coleccin de
elementos nodos, en donde cada uno contiene
datos y un enlace.
Un nodo es una secuencia de caracteres en memoria
dividida en campos (de cualquier tipo).
Un nodo siempre contiene la direccin de memoria
del siguiente nodo de informacin si este existe.
Un apuntador es la direccin de memoria de un nodo
DATO

ENLACE

LISTAS ENLAZADAS
El campo ENLACE, que es de tipo
puntero, es el que se usa para
establecer el enlace con el siguiente
nodo de la lista.
Si el nodo fuera el ltimo, este
campo recibe como valor NULL
(vaco).

Listas Enlazadas frente a Arrays


Las listas enlazadas tienen las siguiente
ventajas sobre los arrays:
Las listas por ser una estructura de datos
dinmica, el tamao de la misma puede
cambiar durante la ejecucin del programa a
diferencia con los arreglos.
No tener que redimensionar la estructura y
poder agregar elemento tras elemento
indefinidamente.

Arrays frente a Listas Enlazadas


En contraste, los arrays ofrecen las
siguiente ventajas sobre las listas
enlazadas:
Los elementos de los arrays ocupan
menos memoria que los nodos
porque no requieren campos de
enlace.
Los arrays ofrecen un aceso ms
rpido a los datos, medante ndices
basados en enteros.

Ejemplo
1EJEMPLO DE LISTA ENLAZADA
255-> 60-> 31-> 5-> 4-> 51-> 9-> 27-> 68-> 62-> NULL
3
4Internamente:
5Nodo-> Dato: 55 Direcion: 0x3d2c00 Siguiente: 0x3d2c80
6Nodo-> Dato: 60 Direcion: 0x3d2c80 Siguiente: 0x3d2c90
7Nodo-> Dato: 31 Direcion: 0x3d2c90 Siguiente: 0x3d2ca0
8Nodo-> Dato: 5 Direcion: 0x3d2ca0 Siguiente: 0x3d2cb0
9Nodo-> Dato: 4 Direcion: 0x3d2cb0 Siguiente: 0x3d2cc0
10Nodo-> Dato: 51 Direcion: 0x3d2cc0 Siguiente: 0x3d3ab8
11Nodo-> Dato: 9 Direcion: 0x3d3ab8 Siguiente: 0x3d3ac8
12Nodo-> Dato: 27 Direcion: 0x3d3ac8 Siguiente: 0x3d3ad8
13Nodo-> Dato: 68 Direcion: 0x3d3ad8 Siguiente: 0x3d3ae8
14Nodo-> Dato: 62 Direcion: 0x3d3ae8 Siguiente: 0

struct nodo { int dato; struct nodo *otronodo; };

Estructura de un elemento
Lista
Las estructuras de datos estn compuestas de otras
pequeas estructuras llamadas NODOS o
elementos, que agrupan los datos con los que
trabajar nuestro programa y adems uno o ms
punteros autoreferenciales, es decir, punteros a
objetos del mismo tipo nodo.
Una estructura bsica de un nodo para crear listas
de datos seria:
struct nodo
int dato;
struct nodo
};

{
*otronodo;

struct nodo {
int dato;
struct nodo *otronodo;
};

El campo "otronodo" puede apuntar a un objeto del


tipo nodo. De este modo, cada nodo puede usarse
como un ladrillo para construir listas de datos, y cada
uno mantendr ciertas relaciones con otros nodos.
Para acceder a un nodo de la estructura slo
necesitaremos un puntero a un nodo.
Las estructuras dinmicas son una implementacin de
TADs (Tipos Abstractos de Datos).
En estos tipos el inters se centra ms en la estructura
de los datos que en el tipo concreto de informacin
que almacenan.

Tipos de Listas Enlazadas


Simplemente Enlazada
Cada elemento slo dispone de un
puntero, que apuntar al siguiente
elemento de la lista o valdr NULL si es
el ltimo elemento.

Tipos de Listas Enlazadas


Simplemente Enlazada

Pilas: Son un tipo especial de lista,


conocidas como listas LIFO (Last In, First
Out: el ltimo en entrar es el primero en
salir). Los elementos se "amontonan" o
apilan, de modo que slo el elemento que
est encima de la pila puede ser ledo, y
slo pueden aadirse elementos encima de
la pila.

Tipos de Listas Enlazadas


Simplemente Enlazada

Colas: Otro tipo de listas, conocidas


como listas FIFO (First In, First Out: El
primero en entrar es el primero en
salir). Los elementos se almacenan en
fila, pero slo pueden aadirse por un
extremo y leerse por el otro.

Tipos de Listas Enlazadas


Listas doblemente enlazadas:
Cada elemento dispone de dos
punteros, uno a punta al siguiente
elemento y el otro al elemento
anterior. Al contrario que las listas
abiertas anteriores, estas listas
pueden recorrerse en los dos
sentidos.

Tipos de Listas Enlazadas


Listas circulares simplemente
enlazada o listas cerradas:
Son parecidas a las listas abiertas, pero el
ltimo elemento apunta al primero. De
hecho, en las listas circulares no puede
hablarse de "primero" ni de "ltimo".
Cualquier nodo puede ser el nodo de
entrada y salida.

Tipos de Listas Enlazadas


Listas circulares doblemente
enlazada
Son parecidas a las listas circulares, pero
puede recorrerse en ambos sentidos.

Estructura de Datos
Internas
Dinmicas
No Lineales
Arboles
Arboles Binarios
Grafos

Estructura de Datos No Lineales


Arboles: cada elemento dispone de dos o ms punteros,
pero las referencias nunca son a elementos anteriores, de
modo que la estructura se ramifica y crece igual que un rbol.

Arboles binarios: son rboles donde cada nodo slo


puede apuntar hasta dos nodos.

Arboles binarios de bsqueda (ABB): son rboles binarios


ordenados. Desde cada nodo todos los nodos de una rama sern
mayores, segn la norma que se haya seguido para ordenar el rbol, y
los de la otra rama sern menores.

Arboles AVL: son tambin rboles de bsqueda, pero su


estructura est ms optimizada para reducir los tiempos de bsqueda.

Arboles B: son estructuras ms complejas, aunque tambin se


trata de rboles de bsqueda, estn mucho ms optimizados que los
anteriores.

Grafos: es el siguiente nivel de complejidad, podemos


considerar estas estructuras como rboles no jerarquizados.

Listas enlazadas.
La lista enlazada es unTDAque nos permite
almacenar datos de una forma organizada, al igual
que los vectores pero, a diferencia de estos, esta
estructura es dinmica, por lo que no tenemos que
saber "a priori" los elementos que puede contener.
En una lista enlazada, cada elemento apunta al
siguiente excepto el ltimo que no tiene sucesor y
el valor del enlace esNULL. Por ello los elementos
son registros que contienen el dato a almacenar y
un enlace al siguiente elemento. Los elementos de
una lista, suelen recibir tambin el nombre de
NODOS de la lista.

struct lista {
int dato;
lista *siguiente;
};

1.- Representa el dato a almacenar. Puede ser de


cualquier tipo; en este ejemplo se trata de una lista
de enteros.
2.- Es un puntero al siguiente elemento de la lista;
con este puntero enlazamos con el sucesor, de
forma que podamos construir la lista.

Esquema de un nodo y una lista enlazada.

Listas abiertas
La forma ms simple de estructura dinmica es la lista abierta. En
esta forma los nodos se organizan de modo que cada uno apunta al
siguiente, y el ltimo no apunta a nada, es decir, el puntero del
nodo siguiente vale NULL.
En las listas abiertas existe un nodo especial: el primero.
Normalmente diremos que nuestra lista es un puntero a ese primer
nodo y llamaremos a ese nodo la cabeza de la lista. Eso es porque
mediante ese nico puntero podemos acceder a toda la lista.
Cuando el puntero que usamos para acceder a la lista vale NULL,
diremos que la lista est vaca.
El nodo tpico para construir listas tiene esta forma:

struct nodo {
int dato;
struct nodo *siguiente;
};

Declaraciones de tipos para


manejar listas en C

Normalmente se definen varios tipos que facilitan el manejo de las listas,


en C, la declaracin de tipos puede tener una forma parecida a esta:

typedef struct _nodo {


int dato;
struct _nodo *siguiente;
} tipoNodo;
typedef tipoNodo *pNodo;
typedef tipoNodo *Lista;
tipoNodo es el tipo de dato para declarar nodos.
pNodo es el tipo para declarar punteros a un nodo.
Lista es el tipo para declarar listas,
Como puede verse, un puntero a un nodo y una lista son la misma
cosa. En realidad, cualquier puntero a un nodo es una lista, cuyo
primer elemento es el nodo apuntado.

Operaciones bsicas con listas


Con las listas tendremos un pequeo repertorio de
operaciones bsicas que se pueden realizar:
Aadir o insertar elementos.
Buscar o localizar elementos.
Borrar elementos.
Moverse a travs de una lista, anterior, siguiente,
primero.
Cada una de estas operaciones tendr varios casos
especiales, por ejemplo, no ser lo mismo insertar
un nodo en una lista vaca, o al principio de una lista
no vaca, o la final, o en una posicin intermedia.

Insertar elementos en una lista abierta

Insertar un elemento en una lista vaca


Se parte que se tiene el nodo a insertar y
un puntero que apunte a l, adems el
puntero a la lista valdr NULL:
Lista vaca
El proceso es muy simple, bastar con que:
1. nodo->siguiente apunte a NULL.
2. Lista apunte a nodo.

Insertar un elemento en la
primera posicin de una lista
Considerando una lista no vacia.
Se parte de un nodo a insertar, con un puntero
que apunte a l, y de una lista no vaca:
Insertado al principio
El proceso sigue siendo muy sencillo:
1. Hacemos que nodo->siguiente apunte a Lista.
2. Hacemos que Lista apunte a nodo.

Insertar un elemento en la ltima posicin


Se parte de considerar una lista no vaca:
Insertar al final
Necesitamos un puntero que seale al ltimo elemento de la
lista. La manera de conseguirlo es empezar por el primero y
avanzar hasta que el nodo que tenga como siguiente el valor
NULL.
1. Hacer que nodo->siguiente sea NULL.
2. Hacer que ultimo->siguiente sea nodo.

Insertar un elemento a
continuacin de un nodo
cualquiera de una lista
Ahora el nodo "anterior" ser aquel a continuacin del cual
insertaremos el nuevo nodo:
Insertar dentro
Suponemos que ya disponemos del nuevo nodo a insertar,
apuntado por nodo, y un puntero al nodo a continuacin del que
lo insertaremos.
El proceso a seguir ser:
Hacer que nodo->siguiente seale a anterior->siguiente.
Hacer que anterior->siguiente seale a nodo.

Localizar elementos en una lista


abierta

Para recorrer una lista, ya sea buscando un valor particular


o un nodo concreto. Las listas abiertas slo pueden
recorrerse en un sentido, ya que cada nodo apunta al
siguiente, pero no se puede obtener, por ejemplo, un
puntero al nodo anterior desde un nodo cualquiera si no se
empieza desde el principio.
Para recorrer una lista usaremos un puntero auxiliar como
ndice:
1. Asignamos al puntero ndice el valor de Lista.
2. Abriremos un bucle que al menos debe tener una condicin, que
el ndice no sea NULL.
3. Dentro del bucle asignaremos al ndice el valor del nodo
siguiente al ndice actual.

Supongamos que slo queremos mostrar los valores hasta que encontremos
uno que sea mayor que 100, podemos sustituir el bucle por:

Localizar elementos en una lista abierta


Muy a menudo necesitaremos recorrer una lista, ya sea
buscando un valor particular o un nodo concreto. Las
listas abiertas slo pueden recorrerse en un sentido, ya
que cada nodo apunta al siguiente, pero no se puede
obtener, por ejemplo, un puntero al nodo anterior desde
un nodo cualquiera si no se empieza desde el principio.
Para recorrer una lista procederemos siempre del mismo
modo, usaremos un puntero auxiliar como ndice:
1. Asignamos al puntero ndice el valor de Lista.
2. Abriremos un bucle que al menos debe tener una
condicin, que el ndice no sea NULL.
3. Dentro del bucle asignaremos al ndice el valor del nodo
siguiente al ndice actual.

You might also like