Vous êtes sur la page 1sur 55

Instituto Tecnológico Superior de Guasave

Ingeniería en Sistemas Computacionales


Estructura de Datos
Unidad III: Estructuras Lineales
Mtro. José Antonio Sandoval Acosta
Retícula ISIC-2010-224: Programa: AED-1026/2016

Itsguasave.edu.mx
ESTRUCTURA DE DATOS

Competencia de la Unidad
• Comprende y aplica estructuras de datos lineales para solución de
problemas.
ESTRUCTURA DE DATOS
Estructuras Lineales
• En esta unidad se comienza el estudio de las estructuras de datos dinámicas.
Al contrario que las estructuras de datos estáticas (arrays) en las que su
tamaño en memoria se establece durante la compilación y permanece
inalterable durante la ejecución del programa, las estructuras de datos
dinámicas crecen y se contraen a medida que se ejecuta el programa, por lo
que la cantidad de memoria que requieren para funcionar es muy variable.

• Las estructuras lineales de elementos homogéneos implementadas con arrays


necesitan fijar por adelantado el espacio a ocupar en memoria, de modo que
cuando se desea añadir un nuevo elemento, que rebase el tamaño prefijado,
no será posible sin que se produzca un error en tiempo de ejecución. Esto hace
ineficiente el uso de los arrays en algunas aplicaciones.
ESTRUCTURA DE DATOS

PILAS
ESTRUCTURA DE DATOS
PILAS
PILA: Es un conjunto de elementos que solo pueden insertarse y
eliminarse por un extremo. Se trata de una estructura de datos de
acceso restrictivo a sus elementos.
Un ejemplo de pila es una torre de discos compactos, en la cual los
discos se insertan y se extraen por el mismo extremo.
ESTRUCTURA DE DATOS
• En la computación estas estructuras suelen ser fundamentales. La recursividad
se simula en un computador con la ayuda de una pila. Asimismo muchos
algoritmos emplean las pilas como estructura de datos fundamental, por
ejemplo para mantener una lista de tareas pendientes que se van acumulando.

• Las pilas ofrecen dos operaciones fundamentales, que son apilar y desapilar
sobre la cima. El uso que se les de a las pilas es independiente de su
implementación interna. Es decir, se hace un encapsulamiento. Por eso se
considera a la pila como un tipo abstracto de datos.

• Es una estructura de tipo LIFO (Last In First Out), es decir, último en entrar,
primero en salir.
ESTRUCTURA DE DATOS
ELEMENTOS DE UNA PILA
• Tope o cima: Indica el último elemento insertado en la pila.
• Máximo: Se refiere al número de elementos que puede contener la pila.
ESTRUCTURA DE DATOS
• Pilas con Arreglos: Representar pilas usando arreglos es relativamente más
sencillo que usando listas enlazadas, el único problema que existe es la
limitante de espacio en memoria, ya que al definir un tamaño máximo ya no es
posible insertar más elementos.
ESTRUCTURA DE DATOS
• Pilas con Listas enlazadas: Son llamadas también estructuras dinámicas, ya
que el espacio en memoria se crea hasta que se inserta el elemento.
ESTRUCTURA DE DATOS
OPERACIONES CON PILAS
Insertar un elemento Eliminar un elemento

Operaciones Auxiliares con PILAS


• Pila llena (si el tope == Máximo-1)
• Pila vacía (si tope == -1)
• Recorrer pila (desde elemento 0 hasta tope)
ESTRUCTURA DE DATOS
Estatus de las PILAS
ESTRUCTURA DE DATOS
TRABAJANDO CON PILAS POR MEDIO DE ARRAYS (ESTÁTICAS)
Crear las variables necesarias Pila

int pila[5]; Máximo de


elementos
int maximo=5;
Iniciar tope con
Int tope=-1;
valor negativo
Int dato=0;
Int opc=0; Variable para
captura de datos

Variable para menú


de opciones
ESTRUCTURA DE DATOS
VERIFICAR SI LA PILA ESTA LLENA

Algoritmo
FUNCION boolena llena()
SI (tope == maximo – 1)
regresar verdadero
SINO
regresar falso
FINSI
FINFUNCION
ESTRUCTURA DE DATOS
VERIFICAR SI LA PILA ESTA VACIA

Algoritmo
FUNCION boolena vacia()
SI (tope == – 1)
regresar verdadero
SINO
regresar falso
FINSI
FINFUNCION
ESTRUCTURA DE DATOS
INSERTAR ELEMENTO EN LA PILA

Algoritmo
MODULO insertar() {
SI LA PILA ESTA LLENA
MOSTRAR “Pila llena”
SINO
CAPTURAR ELEMENTO
INCREMENTAR tope EN 1
pila[tope]=ELEMENTO;
FINSI
FINMODULO
ESTRUCTURA DE DATOS
ELIMINAR ELEMENTO EN LA PILA

Algoritmo
MODULO eliminar() {
SI LA PILA ESTA VACIA
MOSTRAR “Pila Vacia”
SINO
MOSTRAR CONTENIDO
ELIMINAR ELEMENTO
DECREMENTAR TOPE EN 1
FINSI
FINMODULO
ESTRUCTURA DE DATOS
RECORRIDO DE UNA PILA
Algoritmo
MODULO recorrer() {
DECLARAR var de trabajo
SI LA PILA ESTA VACIA
MOSTRAR “Pila Vacia”
SINO
MIENTRAS var<=tope
MOSTRAR CONTENIDO
INCREMENTAR var en 1
FINMIENTRAS
FINSI
FINMODULO
ESTRUCTURA DE DATOS
• Ejercicio: Desarrolle el programa correspondiente a la PILA que se ha visto en
clase creando un menú que contemple las siguientes opciones:

1. Pila llena
2. Pila vacía
3. Insertar
4. Eliminar
5. Recorrido
6. Terminar

• Entregar el programa en código para revisión


ESTRUCTURA DE DATOS

COLAS
ESTRUCTURA DE DATOS
Definición de COLAS
Una COLA es un conjunto homogéneo de elementos, del cual
pueden suprimirse elementos sólo desde un extremo llamado
parte delantera, asimismo, sólo pueden agregarse elementos en
el extremo contrario llamado parte posterior.

• El primer elemento en ser agregado a una COLA es


el primer elemento en ser eliminado.
• Por esta razón una COLA se denomina FIFO (First
In-First Out), que es justo el concepto contrario a
una PILA o LIFO (Last In-First Out).
ESTRUCTURA DE DATOS
COLAS DINÁMICAS CON NODOS

Parte
Delantera o
Salida
Parte
Posterior o
Entrada
ESTRUCTURA DE DATOS

COLAS ESTÁTICAS CON ARRAYS


Parte
Posterior o
Entrada

Operaciones Auxiliares con COLAS Parte


Delantera
• COLA llena (si el final == Máximo-1)
o Salida
• COLA vacía (si final == -1)
• Recorrer COLA (desde elemento 0 hasta final)
ESTRUCTURA DE DATOS
TRABAJANDO CON COLAS ESTÁTICAS
• Una cola estática utiliza un arreglo con un número limitado de elementos en el
mismo, dicho arreglo requiere de una constante que controle el máximo de
elementos que pueden ser cargados a la cola, y de una variable que controle el
elemento final de la cola (último en ser insertado).

• Declaración de las variables de la COLA estática


COLA
int cola[5];
int final = -1; Último elemento
int maximo = 5;
Máximo de elementos
ESTRUCTURA DE DATOS
ALGORITMO PARA DETERMINAR SI LA COLA ESTÁ LLENA

ALGORITMO
FUNCION BOLEANA llena ()
SI (final >= maximo - 1 ) ENTONCES
REGRESAR verdadero
SINO
REGRESAR falso
FINSI
FINFUNCION
ESTRUCTURA DE DATOS
ALGORITMO PARA DETERMINAR SI LA COLA ESTÁ VACIA

ALGORITMO
FUNCION BOLEANA vacia ()
SI (final < 0) ENTONCES
REGRESAR verdadero
SINO
REGRESAR falso
FINSI
FINFUNCION
ESTRUCTURA DE DATOS
ALGORITMO PARA INSERTAR ELEMENTO EN LA COLA

ALGORITMO
MODULO insertar(DATO)
SI (llena) ENTONCES
IMPRIME “cola llena”
SINO
incrementar final
cola[final]=DATO
FINSI
FINMODULO
ESTRUCTURA DE DATOS
ALGORITMO PARA ELIMINAR ELEMENTO EN LA COLA
ALGORITMO
MODULO eliminar ()
SI (vacia) ENTONCES
IMPRIME “cola vacia”
SINO
FOR (J=0, J<máximo, j++)
cola[j]=cola[j+1]
FINFOR
FINSI
DECREMENTAR final
FINMODULO
ESTRUCTURA DE DATOS
ALGORITMO PARA HACER RECORRIDO DE COLA
ALGORITMO
MODULO recorrer ()
SI (vacia) ENTONCES
IMPRIME “cola vacia”
SINO
FOR (J=0, J<=final, j++)
imprime cola[j]
FINFOR
FINSI
FINMODULO
ESTRUCTURA DE DATOS
• Ejercicio: Desarrolle el programa correspondiente a la COLA que se ha visto en
clase creando un menú que contemple las siguientes opciones:
1. Cola llena
2. Cola vacía
3. Insertar
4. Eliminar
5. Recorrido
6. Salir
• Nota: Cada vez que se desee eliminar un elemento debe verificarse la cantidad
que se desea eliminar: si es menor al valor del elemento en la parte delantera
de la cola deberá restarse pero sin eliminar el elemento; si es mayor debe
eliminarse y el faltante restarlo del siguiente elemento en la cola a manera de
un inventario de almacén.
ESTRUCTURA DE DATOS

LISTAS ENLAZADAS
ESTRUCTURA DE DATOS
• Una lista enlazada es una 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”.
• La idea básica consiste en construir una lista cuyos elementos, llamados
nodos, se componen de dos partes o campos:
 La primera parte contiene la información y es, por consiguiente, un valor
de un tipo genérico (denominado Dato, TipoElemento, Info, etc.);
 La segunda parte es un enlace que apunta al siguiente nodo de la lista.
ESTRUCTURA DE DATOS
• La representación gráfica más extendida es aquella que utiliza una caja con dos
secciones en su interior. En la primera sección se encuentra el elemento o
valor a almacenar y en la segunda sección el enlace o puntero, representado
mediante una flecha que sale de la caja y apunta al siguiente nodo.
ESTRUCTURA DE DATOS
Clasificación de las listas enlazadas

LISTAS SIMPLEMENTE ENLAZADAS: Cada nodo (elemento)


contiene un único enlace que conecta ese nodo al nodo siguiente
o nodo sucesor. La lista es eficiente en recorridos directos
(“adelante”).
ESTRUCTURA DE DATOS
Clasificación de las listas enlazadas

LISTAS DOBLEMENTE ENLAZADAS: Cada nodo contiene dos


enlaces, uno a su nodo predecesor y el otro a su nodo sucesor. La
lista es eficiente tanto en recorrido directo (“adelante”) como en
recorrido inverso (“atrás”).
ESTRUCTURA DE DATOS
Clasificación de las listas enlazadas

LISTA CIRCULAR SIMPLEMENTE ENLAZADA: Una lista simplemente


enlazada en la que el último elemento (cola) se enlaza al primer
elemento (cabeza) de tal modo que la lista puede ser recorrida de
modo circular (“en anillo”).
ESTRUCTURA DE DATOS
Clasificación de las listas enlazadas
LISTA CIRCULAR DOBLEMENTE ENLAZADA: Una lista doblemente
enlazada en la que el último elemento se enlaza al primer
elemento y viceversa. Esta lista se puede recorrer de modo circular
(en anillo) tanto en dirección directa (“hacia adelante”) como
inversa (“hacia atrás”).
ESTRUCTURA DE DATOS
TRABAJANDO CON LISTAS SIMPLES
• Para trabajar con una lista enlazada debemos crear una estructura que refleje
la información contenida en cada nodo de la misma y que contenga una
variable de tipo apuntador que conecte cada nodo con el nodo siguiente.

La variable tipo apuntador


se define con un asterisco
y debe ser del mismo tipo
de la estructura declarada
ESTRUCTURA DE DATOS
TRABAJANDO CON LISTAS
• Después debemos definir el nombre de la lista que utilizaremos a lo largo de
nuestro programa y una serie de variables auxiliares que servirán para la
creación de nodos, estas variables también son de tipo apuntador.

Cuando declaramos una variable con


un asterisco antes del nombre
estamos reservando un espacio de
memoria para el objeto que
posteriormente será creado
ESTRUCTURA DE DATOS
INSERTAR NODO INICIAL O CABECERA DE LA LISTA

• Cando declaramos la variable I utilizando un asterisco (*I) lo que hicimos fue


reservar un espacio en memoria para almacenar la información, por lo que al
insertar el primer nodo sólo es necesario crear el objeto o nodo que
utilizaremos:
Algoritmo de inserción
Crea el nuevo
Crear el nuevo nodo
objeto o nodo
Asignar la información
al campo
Asigna valor a la
correspondiente
variable de trabajo
Asignar NULL a la
variable apuntador Apunta a NULL ya que no hay
otros nodos por el momento
ESTRUCTURA DE DATOS
SI T==NULL
crear nuevo nodo
asignar datos al campo correspondiente
asignar NULL a la variable apuntador
ALGORITMO DE INSERCIÓN apunta la cabecera al nuevo nodo cola
SINO
DE NODOS SUBSECUENTES
reservar memoria y crear nuevo nodo
EN LA LISTA (INCLUYENDO
asignar datos al campo correspondiente
NODO COLA O “TAIL”). asignar NULL a la variable apuntador del nodo final
enlazar el nodo anterior con el nuevo
igualar nodo cola a nodo de trabajo
FINSI
ESTRUCTURA DE DATOS
INSERTAR NODOS SUBSECUENTES EN LA LISTA
Crea el nodo
(INCLUYENDO NODO COLA O “TAIL”).
Asigna Datos
Apunta a NULL
Cuando no hay
el nodo final
ningún nodo
salvo la cabeza Apunta la cabecera
al nuevo nodo cola
Reserva memoria y crea
el nodo
Cuando ya existe Asigna Datos
un nodo cola, se Apunta a NULL
agrega otro al el nuevo nodo
final y se cambia
Enlaza el nodo
la referencia del
anterior al nuevo
nodo cola
Asigna nodo cola
ESTRUCTURA DE DATOS
RECORRER LA LISTA DESDE EL INICIO
• Algoritmo de recorrido
Igualar nodo de trabajo a nodo cabeza
MIENTRAS nodo de trabajo != Nulo
Imprimir datos del nodo
Nodo de trabajo = siguiente nodo
FINMIENTRAS
• Código en C++
ESTRUCTURA DE DATOS
ALGORITMO DE INSERCIÓN DE NODOS AL INICIO DE LA LISTA O NODO CABEZA.

SI cabeza==NULL
crear nuevo nodo inicial
asignar datos al campo correspondiente
asignar NULL a la variable apuntador
SINO
reservar memoria y crear nuevo nodo
asignar datos al campo correspondiente
enlazar el nodo actual con el nodo cabeza
igualar nodo cabeza al nodo actual
FINSI
ESTRUCTURA DE DATOS
CÓDIGO DE INSERCIÓN DE NODOS AL INICIO DE LA LISTA O
NODO CABEZA.

Crea nodo
cabeza
Cuando no hay
ningún nodo en
la lista
Reserva memoria y
Cuando ya crea el nodo
existe un nodo
CABEZA, se Asigna Datos
agrega el nuevo
al inicio
Nuevo nodo apunta
al nodo inicial
Convierte el nuevo
nodo en nodo CABEZA
ESTRUCTURA DE DATOS
ELIMINAR UN NODO DE LA LISTA SI (DATO == cabeza-> info)
hacer auxiliar = nodo inicial
• Para eliminar un nodo de la lista hacer nodo cabeza= auxiliar->siguiente
debemos verificar primero si se eliminar(auxiliar)
trata del nodo cabeza o de un SINO
anterior = cabeza
nodo subsecuente. actual = cabeza->siguiente
• Para realizar esta eliminación MIENTRAS (actual != NULL && actual->info != DATO)
anterior = actual
son necesarios 3 variables actual = actual->siguiente
auxiliares tipo nodo: auxiliar, FINMIENTRAS
actual, anterior SI (actual != NULL)
auxiliar = actual
• A continuación se presenta el anterior->siguiente = actual->siguiente
algoritmo para hacer dicha eliminar(auxiliar)
verificación y la posterior SI (anterior->siguiente ==NULL) T=anterior FINSI
FINSI
eliminación; FINSI
ESTRUCTURA DE DATOS

CÓDIGO DE ELIMINACIÓN
DE UN NODO DE LA LISTA
ESTRUCTURA DE DATOS
• Ejercicio: Realizar el programa completo con listas enlazadas simples.
 Debe incluir menú de opciones;
 Debe incluir módulo de captura de Nodo de Inicio o Nodo Cabeza;
 Debe poder capturar Nodo Cola;
 Debe poder insertar un nuevo Nodo Cabeza;
 Debe poder eliminar un nodo seleccionado;
 Debe incluir un recorrido desde el Nodo Cabeza hasta el Nodo Cola
mostrando el promedio los elementos contenidos y el número de nodos
de la lista;
• Entregar el programa
ESTRUCTURA DE DATOS
TRABAJANDO CON LISTAS DE DOBLE ENLACE Y CIRCULARES
• Lo primero que debemos hacer es crear una estructura apropiada que refleje
doble enlace que puede ser circular.
La variable tipo apuntador
se dirigen el flujo de la lista
en ambos sentidos y
también pueden generar
una estructura circular.
ESTRUCTURA DE DATOS
INSERTAR NODO INICIAL O CABECERA DE LA LISTA

• Cuando declaramos la variable I utilizando un asterisco (*I) lo que hicimos fue


reservar un espacio en memoria para almacenar la información, por lo que al
insertar el primer nodo sólo es necesario crear el objeto o nodo que
utilizaremos:
Algoritmo de inserción
• Crear el nuevo nodo
• Asignar la información al
campo correspondiente
• Asignar valor a las
variables apuntador
• Asignar nodo cola
ALGORITMO DE INSERCIÓN DE NODOS SUBSECUENTES EN LA LISTA
ESTRUCTURA DE DATOS (INCLUYENDO NODO COLA O “TAIL”)

• Reservar memoria y crear nuevo


nodo
• Asignar datos al campo
correspondiente
• Asignar INICIO a la variable
apuntador siguiente del nodo
creado
• Asignar ANTERIOR valor de
nodo final
• Asignar SIGUIENTE del nodo
final al nodo creado
• Asignar ANTERIOR al nodo inicio
valor del nodo creado
• Convertir COLA en nodo creado
ESTRUCTURA DE DATOS CÓDIGO DE INSERCIÓN DE NODOS AL INICIO DE LA LISTA O NODO CABEZA.

• Reservar memoria y crear


nuevo nodo
• Asignar al nodo actual
datos
• Enlazar el nodo creado con
el nodo cabeza
• Enlazar nodo creado con
nodo cola o final
• Enlazar nodo inicio con
nodo creado
• Igualar nodo cabeza al
nodo creado
• Igualar nodo cola con el
nuevo nodo cabeza
ESTRUCTURA DE DATOS
RECORRER LA LISTA DESDE EL INICIO

Igualar nodo de trabajo a nodo cabeza


REPETIR
Imprimir datos del nodo
Nodo de trabajo = siguiente nodo
MIENTRAS nodo de trabajo != nodo cabeza
ESTRUCTURA DE DATOS ELIMINAR UN NODO DE LA LISTA
ESTRUCTURA DE DATOS
• Ejercicio: Realizar el programa completo con listas enlazadas doble-circular
incluyendo los campos numero de vendedor y total de ventas del mes.
 Debe incluir menú de opciones;
 Debe incluir módulo de captura de Nodo de Inicio o Nodo Cabeza;
 Debe poder capturar Nodo Subsecuente o Nodo Cola;
 Debe poder insertar un nuevo Nodo Cabeza;
 Debe poder eliminar un nodo seleccionado;
 Debe incluir un recorrido desde el Nodo Cabeza hasta el Nodo Cola
mostrando el promedio de ventas de todos los vendedores en la lista.
• Entregar el programa
ESTRUCTURA DE DATOS
Bibliografía

• Joyanes, Zahonero. Estructura de Datos en C++. McGraw Hill. Madrid, España.


2007. ISBN: 978-84-481-5645-9.

Vous aimerez peut-être aussi