ESTRUCTURAS DINÁMICAS DE DATOS (COLAS) EN C

Documentos relacionados
ESTRUCTURAS DINÁMICAS DE DATOS (PILAS) EN C

ESTRUCTURAS DINÁMICAS DE DATOS EN LENGUAJE C

ESTRUCTURAS DINÁMICAS DE DATOS

UNIVERSIDAD AUTONOMA DE MADRID ESCUELA POLITÉCNICA SUPERIOR ESTRUCTURAS DE DATOS Y ALGORITMOS

ESTRUCTURAS DINÁMICAS DE DATOS (LISTAS)

Estructura de datos Colas

APUNTADORES. Un apuntador es un objeto que apunta a otro objeto. Es decir, una variable cuyo valor es la dirección de memoria de otra variable.

ESTRUCTURAS DINÁMICAS DE DATOS (LISTAS)

UNIDAD 8 Tipos de datos dinámicos: Punteros Asignación dinámica de memoria. Uso de punteros. Inicialización y asignación de punteros.

12. COLAS Introducción Fundamentos

UNIDAD 8 Tipos de datos dinámicos: Punteros Asignación dinámica de memoria. Uso de punteros. Inicialización y asignación de punteros.

Estructuras Dinámicas de datos.

Ingeniera de Sistemas: Luz Esperanza Espitia Tutora de Estructura de datos.

LISTAS ENLAZADAS FUNDAMENTOS TEORICOS

ESTRUCTURAS DINÁMICAS DE DATOS (PILAS)

Este material es de uso exclusivo para estudio, los textos fueron tomados textualmente de varios libros por lo que está prohibida su impresión y

Universidad Autónoma del Estado de México 2016, Año del 60 Aniversario de la Universidad Autónoma del Estado de México

Profesor: José Miguel Rubio L.

ESTRUCTURAS. Struct Identificador_ tipo_estructura { Tipo miembro_1; /*Declaración de los miembros*/

Estructuras Dinámicas

Punteros. Índice. 1. Qué es un puntero y por que son importantes.

TEMA 8: Gestión dinámica de memoria

Listas lineales (circulares,doblemente enlazadas recopilación Raúl H Ruiz C)

Tipos Recursivos de Datos

(1) Recordemos qué es una pila...

Instituto Politécnico Nacional

A l g o r i t m o y E s t r u c t u r a d e D a t o s Ing. en Sistemas de Información - 1º año -

Tema 7- Modelo y Aplicación de Pila, Cola y. Tema 7- Modelo y Aplicación de. Lista Con Punto de Interés

Programación TADs Lineales Lista Pila Cola

Tema 8. Listas. José M. Badía, Begoña Martínez, Antonio Morales y José M. Sanchiz

Arboles Binarios de Búsqueda en C++

Implementaciones de pilas, colas y afines. Memoria dinámica.

Capitulo V Listas Enlazadas

A l g o r i t m o y E s t r u c t u r a d e D a t o s Ing. en Sistemas de Información - 1º año -

PUNTEROS O APUNTADORES C++

Estructura de Datos. TDA: Listas. Primer Semestre, Indice. Tipos de estructura de datos lineales

Árboles. Árboles. Árboles binarios de búsqueda. Árboles. Inserción en un árbol. Árbol binario de búsqueda

Definición de árbol. Árboles

Práctica 2 - Manejo de estructuras de datos y punteros

Segundo Parcial de Programación 2 7 de junio de 2017

Estructura de Datos: Lista. Facultad Ingeniería y Tecnología Informática Tecnicatura en Programación de Computadoras. Autora: Prof.

Capítulo. Listas, pilas y colas en C. Contenido. Introducción

Hoja de ejercicios del Tema 9

Algoritmos y Estructuras de Datos Pilas LIFO y Colas FIFO. Guillermo Román Díez

Estructuras de Datos Dinámicas. Diseñar y programar en lenguaje C soluciones utilizando estructuras de datos dinámicas

Las FILAS. ING PEDRO BELTRÁN CANESSA Estructuras de Datos 1

Tema 5 Tabla de Símbolos

Contenido PARTE II: ESTRUCTURAS DE DATOS AVANZADAS

UNIDAD 2. ESTRUCTURAS DE DATOS SECUENCIALES. 1. Pilas (Stacks)

Tema: Tipos Abstractos de Datos (TAD s) en C++.

UNIVERSIDAD BANCARIA DE MEXICO CONSTANCIA UNIDAD Y TRABAJO Guadalupe Godínez Maldonado Prof. Juan Carlos Martínez

Estructuras Enlazadas AyED UTN-BA

Estructuras de datos: Pilas, Colas, Listas

Memoria en C++ Punteros - Referencias Clases Y ahora, a trabajar! Memoria Dinámica en C++

ELO320 Estructuras de Datos y Algoritmos. Listas. Tomás Arredondo Vidal

IMPLEMENTACIÓN DE PILAS CON LISTAS EN C++

UNIVERSIDAD NACIONAL AUTÓNOMA DE MÉXICO

Implementación de las Clases Pila, Cola, Lista y Arbol

LISTAS. Prof. Ing. M.Sc. Fulbia Torres

Pilas y Colas. Cursos Propedéuticos Dr. René Cumplido M. en C. Luis Rodríguez Flores

Estructuras de Datos Dinámicas

Tema: Tipos Abstractos de Datos (TAD s) en C#.

1. El Tipo Abstracto de Datos.

Estructura de Datos. Pilas Colas. Primer Semestre, Indice. TDA: Pilas TDA: Colas Colas de Prioridad Anillos BiColas BiColas Circulares

ESTRUCTURA DE DATOS. Memoria estática Memoria dinámica Tipo puntero Declaración de punteros Gestión de memoria dinámica Resumen ejemplo

Estructura de datos y algoritmos. Tema IV: TIPOS DE DATOS ABSTRACTOS DINÁMICOS LINEALES

Principal material bibliográfico utilizado

Estructura de Datos. Unidad de Aprendizaje: Unidad de Competencia II: Estructuras de Datos Lineales. M. en C. Edith Cristina Herrera Luna

Punteros. 1.- Paso de parámetros por referencia. Ya hablamos de ésto en funciones. 2.- Declaración de arreglos dinámicos.

Apuntadores (Punteros)

Tema 5. Tipos Abstractos de Datos

Trabajo Práctico Nº 10 Estructuras Dinámicas: Pila y Cola.

Tutorial de Python orientado a objetos

Programación y Algoritmia

Laboratorio de Arquitectura de Redes. Punteros en lenguaje C

Elementos de un programa en C

Tema 6: Memoria dinámica

6. El TDA Lista Implementación con listas enlazadas. es de tipo genérico T. Pueden existir elementos repetidos (a diferencia de los conjuntos).

ALGORITMOS Y PROGRAMACIÓN I Unidad 3

2. ESTRUCTURAS BÁSICAS

Informática PRÀCTICA 9 Curs Práctica Nº 9: Rango y precisión de representación de números en el ordenador.

Introducción al lenguaje C

Estructura de Datos. Árboles Binarios de Búsqueda ABB. Primer Semestre, 2010

ESTRUCTURAS BÁSICAS Concepto de datos estructurados.

Tema 13: Apuntadores en C

Punteros. Definición Un puntero es un dato que contiene una dirección de memoria.

TIPO DE DATO ABSTRACTO (TDA)

Examen Fundamentos de Programación 15 de enero de 2016 Curso 2015/16

Ejercicio 1 (proyecto prlistas, paquete listas)

Abelardo Pardo. Iria Estévez Ayres. Damaris Fuentes Lorenzo. Pablo Basanta Val. Pedro J. Muñoz Merino. Hugo A. Parada.

Estructura de Datos. Listas Enlazadas

ÁRBOL BINARIO. T der. Árbol binario homogéneo es aquel cuyos nodos tienen grado 0 ó 2(no hay ninguno de grado 1).

PUNTEROS (APUNTADORES)

PILAS Fundamentos

Segundo parcial de Programación 2

Listas. Rafael Palacios May/2005

Examen Teórico (1/3 de la nota final)

UNIDAD 9. DATOS COMPLEJOS PILAS

Tema 8- Implementación de Pila, Cola y. Tema 8- Implementación de Pila, Cola y Lista con Punto de Interés. Representación Eficaz de una EDA

Unidad Nº V Listas Enlazadas

Transcripción:

2013 ESTRUCTURAS DINÁMICAS DE DATOS (COLAS) EN C Departamento de Computación UNAN-León

TEMA 5: ESTRUCTURAS DINÁMICAS DE DATOS (COLAS) 5.1 INTRODUCCIÓN: Las colas son secuencias de elementos caracterizadas porque las operaciones de inserción y borrado se realizan sobre extremos opuestos de la secuencia. La inserción se produce en el "final" de la secuencia, mientras que el borrado se realiza en el otro extremo, el "inicio" de la secuencia. Por ejemplo, una fila en un banco. Las restricciones definidas para una cola hacen que el primer elemento que se inserta en ella sea, igualmente, el primero en ser extraído de la estructura. Si una serie de elementos A, B, C, D, E se insertan en una cola en ese mismo orden, entonces los elementos irán saliendo de la cola en el orden en que entraron. Por esa razón, en ocasiones, las colas se conocen con el nombre de listas o secuencias FIFO (First In First Out, el primero que entra es el primero que sale). Las colas, al igual que las pilas, resultan de aplicación habitual en muchos problemas informáticos. Quizás la aplicación más común de las colas es la organización de tareas de un ordenador. En general, los trabajos enviados a un ordenador son "encolados" por éste, para ir procesando secuencialmente todos los trabajos en el mismo orden en que se reciben. Cuando el ordenador recibe el encargo de realizar una tarea, ésta es almacenada al final de la cola de trabajos. En el momento que la tarea que estaba realizando el procesador acaba, éste selecciona la tarea situada al principio de la cola para ser ejecutada a continuación. Todo esto suponiendo la ausencia de prioridades en los trabajos. En caso contrario, existirá una cola para cada prioridad. El símil cotidiano es una cola para comprar, por ejemplo, las entradas del cine. Los nuevos compradores sólo pueden colocarse al final de la cola, y sólo el primero de la cola puede comprar la entrada. Los tipos que definiremos normalmente para manejar colas serán casi los mismos que para manejar listas y pilas, tan sólo cambiaremos algunos nombres: typedef struct _nodo int dato; struct _nodo *siguiente; } tiponodo; 2

typedef tiponodo *pnodo; typedef tiponodo *Cola; tiponodo es el tipo para declarar nodos, evidentemente. pnodo es el tipo para declarar punteros a un nodo. Cola es el tipo para declarar colas. Es evidente, que una cola es una lista abierta. Así que sigue siendo muy importante que nuestro programa nunca pierda el valor del puntero al primer elemento, igual que pasa con las listas abiertas. Además, debido al funcionamiento de las colas, también deberemos mantener un puntero para el último elemento de la cola, que será el punto donde insertemos nuevos nodos. Teniendo en cuenta que las lecturas y escrituras en una cola se hacen siempre en extremos distintos, lo más fácil será insertar nodos por el final, a continuación del nodo que no tiene nodo siguiente, y leerlos desde el principio, hay que recordar que leer un nodo implica eliminarlo de la cola. 5.2 OPERACIONES BÁSICAS CON COLAS: De nuevo nos encontramos ante una estructura con muy pocas operaciones disponibles. Las colas sólo permiten añadir y leer elementos: Encolar: Inserta un elemento al final de la cola. Desencolar: Lee y elimina un elemento del principio de la cola. 5.2.1 ENCOLAR UN ELEMENTO: Las operaciones con colas son muy sencillas, prácticamente no hay casos especiales, salvo que la cola esté vacía. Añadir elemento en una cola vacía: Partiremos de que ya tenemos el nodo a insertar y, por supuesto un puntero que apunte a él, además los punteros que definen la cola, primero y último que valdrán NULL: El proceso es muy simple, bastará con que: nodo->siguiente apunte a NULL. Y que los punteros primero y último apunten a nodo. Añadir elemento en una cola no vacía: De nuevo partiremos de un nodo a insertar, con un puntero que apunte a él, y de una cola, en este caso, al no estar vacía, los punteros primero y último no serán nulos: El proceso sigue siendo muy sencillo: Hacemos que nodo->siguiente apunte a NULL. Después que ultimo->siguiente apunte a nodo. Y actualizamos último, haciendo que apunte a nodo. 3

Añadir elemento en una cola, caso general: Para generalizar el caso anterior, sólo necesitamos añadir una operación: Hacemos que nodo->siguiente apunte a NULL. Si ultimo no es NULL, hacemos que ultimo->siguiente apunte a nodo. Y actualizamos último, haciendo que apunte a nodo. Si primero es NULL, significa que la cola estaba vacía, así que haremos que primero apunte también a nodo. 5.2.3 DESENCOLAR UN ELEMENTO: Recordemos que leer un elemento de una cola, implica eliminarlo. Ahora también existen dos casos, que la cola tenga un solo elemento o que tenga más de uno. Usaremos un puntero a un nodo auxiliar: Hacemos que nodo apunte al primer elemento de la cola, es decir a primero. Asignamos a primero la dirección del segundo nodo de la pila: primero->siguiente. Guardamos el contenido del nodo para devolverlo como retorno, recuerda que la operación de lectura en colas implica también borrar. Liberamos la memoria asignada al primer nodo, el que queremos eliminar. Leer un elemento en una cola con un solo elemento: También necesitamos un puntero a un nodo auxiliar: Hacemos que nodo apunte al primer elemento de la pila, es decir a primero. Asignamos NULL a primero, que es la dirección del segundo nodo teórico de la cola: primero->siguiente. Guardamos el contenido del nodo para devolverlo como retorno, recuerda que la operación de lectura en colas implica también borrar. Liberamos la memoria asignada al primer nodo, el que queremos eliminar. Hacemos que ultimo apunte a NULL, ya que la lectura ha dejado la cola vacía. Leer un elemento en una cola, caso general: Hacemos que nodo apunte al primer elemento de la pila, es decir a primero. Asignamos a primero la dirección del segundo nodo de la pila: primero->siguiente. Guardamos el contenido del nodo para devolverlo como retorno, recuerda que la operación de lectura en colas implica también borrar. Liberamos la memoria asignada al primer nodo, el que queremos eliminar. Si primero es NULL, hacemos que ultimo también apunte a NULL, ya que la lectura ha dejado la cola vacía. 4

Programa en C que muestra el funcionamiento de las colas. #include <stdlib.h> #include <stdio.h> typedef struct _nodo int valor; struct _nodo *siguiente; } tiponodo; typedef tiponodo *pnodo; /* Funciones con colas: */ void Anadir(pNodo *primero, pnodo *ultimo, int v); int Leer(pNodo *primero, pnodo *ultimo); int main() pnodo primero = NULL, ultimo = NULL; Anadir(&primero, &ultimo, 20); printf("añadir(20)\n"); Anadir(&primero, &ultimo, 10); printf("añadir(10)\n"); Anadir(&primero, &ultimo, 40); printf("añadir(40)\n"); Anadir(&primero, &ultimo, 30); printf("añadir(30)\n"); Anadir(&primero, &ultimo, 90); printf("añadir(90)\n"); Estructuras Dinámicas de Datos (Colas) } system("pause"); return 0; 5

void Anadir(pNodo *primero, pnodo *ultimo, int v) pnodo nuevo; /* Crear un nodo nuevo */ nuevo = (pnodo)malloc(sizeof(tiponodo)); nuevo->valor = v; /* Este será el último nodo, no debe tener siguiente */ nuevo->siguiente = NULL; /* Si la cola no estaba vacía, añadimos el nuevo a continuación de ultimo */ if(*ultimo) (*ultimo)->siguiente = nuevo; /* Ahora, el último elemento de la cola es el nuevo nodo */ *ultimo = nuevo; } /* Si primero es NULL, la cola estaba vacía, ahora primero apuntará también al nuevo nodo */ if(!(*primero)) *primero = nuevo; int Leer(pNodo *primero, pnodo *ultimo) pnodo nodo; /* variable auxiliar para manipular nodo */ int v; /* variable auxiliar para retorno */ /* Nodo apunta al primer elemento de la pila */ nodo = *primero; if(!nodo) return 0; /* Si no hay nodos en la pila retornamos 0 */ /* Asignamos a primero la dirección del segundo nodo */ *primero = nodo->siguiente; /* Guardamos el valor de retorno */ v = nodo->valor; } /* Borrar el nodo */ free(nodo); /* Si la cola quedó vacía, ultimo debe ser NULL también*/ if(!*primero) *ultimo = NULL; return v; 6

EJERCICIO PROPUESTO: Realice un programa Agenda que almacene en una cola las actividades del día, el programa deberá permitir: Insertar una actividad. Borrar una actividad. Ver todas las actividades del día. A demás de realizar estas funciones deberá crear una función para asignar memoria a la nueva actividad y otra función que borre todos los elementos, esta última función se realiza para liberar toda la memoria asignada dinámicamente. La estructura a utilizar es la siguiente: typedef struct actividad agenda; struct actividad char act[50]; //Actividad a realizar... char hora[10]; //Hora en la que se realizara la actividad... agenda *siguiente; //Puntero al siguiente elemento... }; 7