ASIGNATURA: ALGORIMICA Y PROGRAMACIÓN, TRAYECTO I- TRIMESTRE III. SECCION: T01. TURNO: NOCTURNO.

Colas

PROFESOR(A): ING. YOHENI GONZALEZ.

........... 3 Operaciones básicas con colas........................... 3 Declaraciones de tipos para manejar colas en C............................................... 9 Algoritmo de la función "leer"......................................................... 5 Añadir elemento en una cola no vacía ................ 8 Leer un elemento en una cola caso general . 3 Definición ............................................ caso general ............................... 7 Leer un elemento en una cola con más de un elemento .............................................................. YOHENI GONZALEZ.... 6 Añadir elemento en una cola................................. implica eliminarlo ........................ 5 Añadir elemento en una cola vacía .................................................................................................................................................................................................................................................. 11 PROFESOR(A): ING...................................... 9 Algoritmo de la función "Anadir" .......................................................................... ..... 4 Añadir un elemento ........................................................................... 6 Leer un elemento de una cola.................................................................................................................................................................. 7 Leer un elemento en una cola con un solo elemento .......................................................................................................... 10 Código del ejemplo completo ...................................................................................................... 8 Ejemplo de cola en C .............................................................................................................................Contenido COLAS ......................................................................................................................................................................................

Este tipo de lista es conocido como lista FIFO (First In First Out). por ejemplo. y sólo el primero de la cola puede comprar la entrada. las escrituras de datos siempre son inserciones de nodos.COLAS Definición Una cola es un tipo especial de lista abierta en la que sólo se puede insertar nodos en uno de los extremos de la lista y sólo se pueden eliminar nodos en el otro. typedef tipoNodo *Cola. }. Declaraciones de tipos para manejar colas en C Los tipos que definiremos normalmente para manejar colas serán casi los mismos que para manejar listas y pilas. Además. Los nuevos compradores sólo pueden colocarse al final de la cola. YOHENI GONZALEZ. como sucede con las pilas. PROFESOR(A): ING. typedef tipoNodo *pNodo. } tipoNodo. las entradas del cine. El nodo típico para construir pilas es el mismo que vimos en los capítulos anteriores para la construcción de listas y pilas: struct nodo { int dato. y las lecturas siempre eliminan el nodo leído. struct nodo *siguiente. . struct _nodo *siguiente. tan sólo cambiaremos algunos nombres: typedef struct _nodo { int dato. el primero en entrar es el primero en salir. El símil cotidiano es una cola para comprar.

Operaciones básicas con colas De nuevo nos encontramos ante una estructura con muy pocas operaciones disponibles. Así que sigue siendo muy importante que nuestro programa nunca pierda el valor del puntero al primer elemento. a continuación del nodo que no tiene nodo siguiente. Las colas sólo permiten añadir y leer elementos: Añadir: Inserta un elemento al final de la cola. que una cola es una lista abierta. PROFESOR(A): ING. evidentemente. y leerlos desde el principio. Cola es el tipo para declarar colas. Teniendo en cuenta que las lecturas y escrituras en una cola se hacen siempre en extremos distintos. igual que pasa con las listas abiertas. debido al funcionamiento de las colas. Además. pNodo es el tipo para declarar punteros a un nodo. hay que recordar que leer un nodo implica eliminarlo de la cola. también deberemos mantener un puntero para el último elemento de la cola. . Leer: Lee y elimina un elemento del principio de la cola. a la vista del gráfico. YOHENI GONZALEZ. lo más fácil será insertar nodos por el final. que será el punto donde insertemos nuevos nodos.tipoNodo es el tipo para declarar nodos. Es evidente.

Hacer que nodo->siguiente apunte a NULL. además los punteros que definen la cola. prácticamente no hay casos especiales. 3. Que el puntero primero apunte a nodo. . 2. Y que el puntero último también apunte a nodo. Añadir elemento en una cola vacía Partiremos de que ya tenemos el nodo a insertar y. salvo que la cola esté vacía. PROFESOR(A): ING. bastará con que: 1. primero y ultimo que valdrán NULL: El proceso es muy simple.Añadir un elemento Las operaciones con colas son muy sencillas. YOHENI GONZALEZ. por supuesto un puntero que apunte a él.

y de una cola. Añadir elemento en una cola. 3. los punteros primero y ultimo no serán nulos: El proceso sigue siendo muy sencillo: 1. significa que la cola estaba vacía. Después que ultimo->siguiente apunte a nodo. Y actualizamos ultimo. con un puntero que apunte a él. 3. hacemos que ultimo->siguiente apunte a nodo. Y actualizamos ultimo. 4. al no estar vacía. Si ultimo no es NULL. 2. en este caso. Si primero es NULL. PROFESOR(A): ING. haciendo que apunte a nodo. . sólo necesitamos añadir una operación: 1. caso general Para generalizar el caso anterior. Hacemos que nodo->siguiente apunte a NULL. haciendo que apunte a nodo. 2.Añadir elemento en una cola no vacía De nuevo partiremos de un nodo a insertar. YOHENI GONZALEZ. Hacemos que nodo->siguiente apunte a NULL. así que haremos que primero apunte también a nodo.

3.Leer un elemento de una cola. Asignamos a primero la dirección del segundo nodo de la pila: primero>siguiente. Liberamos la memoria asignada al primer nodo. PROFESOR(A): ING. 2. . recuerda que la operación de lectura en colas implican también borrar. Leer un elemento en una cola con más de un elemento Usaremos un puntero a un nodo auxiliar: 1. 1. YOHENI GONZALEZ. es decir a primero. implica eliminarlo Ahora también existen dos casos. Hacemos que nodo apunte al primer elemento de la cola. el que queremos eliminar. Guardamos el contenido del nodo para devolverlo como retorno. que la cola tenga un solo elemento o que tenga más de uno.

Liberamos la memoria asignada al primer nodo. ya que la lectura ha dejado la cola vacía. 2.Leer un elemento en una cola con un solo elemento También necesitamos un puntero a un nodo auxiliar: 1. Hacemos que nodo apunte al primer elemento de la pila. Hacemos que ultimo apunte a NULL. 5. 3. 4. es decir a primero. es decir a primero. Leer un elemento en una cola caso general 1. Hacemos que nodo apunte al primer elemento de la pila. 2. Asignamos a primero la dirección del segundo nodo de la pila: primero>siguiente. que es la dirección del segundo nodo teórico de la cola: primero->siguiente. PROFESOR(A): ING. Asignamos NULL a primero. el que queremos eliminar. . recuerda que la operación de lectura en colas implican también borrar. Guardamos el contenido del nodo para devolverlo como retorno. YOHENI GONZALEZ.

hacemos que apunte a nodo. el último elemento de la cola es el nuevo nodo */ *ultimo = nuevo. hacemos que ultimo también apunte a NULL. ya que la lectura ha dejado la cola vacía. YOHENI GONZALEZ. ahora primero apuntará también al nuevo nodo */ if(!*primero) *primero = nuevo. pNodo *ultimo. Si "ultimo" no es NULL. añadimos el nuevo a continuación de ultimo */ if(*ultimo) (*ultimo)->siguiente = nuevo. 4. Ejemplo de cola en C Construiremos una cola para almacenar números enteros.3. Liberamos la memoria asignada al primer nodo. 3. Actualizamos "ultimo" haciendo que apunte a nodo. Haremos pruebas insertando varios valores y leyéndolos alternativamente para comprobar el resultado. /* Si primero es NULL. } PROFESOR(A): ING. Hacemos que nodo->siguiente apunte a NULL. Si "primero" es NULL. 2. . Creamos un nodo para el valor que colocaremos en la cola. no debe tener siguiente */ nuevo->siguiente = NULL. nuevo->valor = v. 5. /* Ahora. Guardamos el contenido del nodo para devolverlo como retorno. la cola estaba vacía. el que queremos eliminar. Si primero es NULL. Algoritmo de la función "Anadir" 1. recuerda que la operación de lectura en colas implican también borrar. int v) { pNodo nuevo. 5. 4. /* Este será el último nodo. /* Si la cola no estaba vacía. hacemos que ultimo->>siguiente apunte a nodo. void Anadir(pNodo *primero. /* Crear un nodo nuevo */ nuevo = (pNodo)malloc(sizeof(tipoNodo)).

Liberamos la memoria asignada al primer nodo. ya que la cola habrá quedado vacía. 2. } PROFESOR(A): ING. /* Si la cola quedó vacía. Asignamos a primero la dirección del segundo nodo de la cola: primero>siguiente. haremos que último también apunte a NULL. . /* Guardamos el valor de retorno */ v = nodo->valor. Si primero es NULL. /* Borrar el nodo */ free(nodo). el que queremos eliminar. 4. Guardamos el contenido del nodo para devolverlo como retorno. /* variable auxiliar para retorno */ /* Nodo apunta al primer elemento de la pila */ nodo = *primero.Algoritmo de la función "leer" 1. es decir a primero. YOHENI GONZALEZ. /* variable auxiliar para manipular nodo */ int v. recuerda que la operación de lectura equivale a leer y borrar. /* Si no hay nodos en la pila retornamos 0 */ /* Asignamos a primero la dirección del segundo nodo */ *primero = nodo->siguiente. int Leer(pNodo *primero. if(!nodo) return 0. return v. Hacemos que nodo apunte al primer elemento de la cola. 5. 3. ultimo debe ser NULL también*/ if(!*primero) *ultimo = NULL. pNodo *ultimo) { pNodo nodo.

nuevo->valor = v. printf("Añadir(40)\n"). &ultimo. pNodo *ultimo. return 0. printf("Añadir(10)\n"). /* Funciones con colas: */ void Anadir(pNodo *primero. } tipoNodo. Leer(&primero. int v). YOHENI GONZALEZ. pNodo *ultimo. printf("Leer: %d\n". 40). Anadir(&primero. Anadir(&primero. /* Crear un nodo nuevo */ nuevo = (pNodo)malloc(sizeof(tipoNodo)).h> typedef struct _nodo { int valor.Código del ejemplo completo Tan sólo nos queda escribir una pequeña prueba para verificar el funcionamiento de las colas: #include <stdio. ultimo = NULL. no debe tener siguiente */ nuevo->siguiente = NULL. int v) { pNodo nuevo. printf("Leer: %d\n". printf("Añadir(30)\n"). /* Este será el último nodo. Leer(&primero. 20). &ultimo. Leer(&primero. Anadir(&primero. Anadir(&primero. 90). &ultimo. getchar(). . &ultimo)). typedef tipoNodo *pNodo. 10). struct _nodo *siguiente. Leer(&primero. } void Anadir(pNodo *primero. Leer(&primero. printf("Leer: %d\n". PROFESOR(A): ING. &ultimo)). 30).h> #include <stdlib. &ultimo. printf("Leer: %d\n". int main() { pNodo primero = NULL. int Leer(pNodo *primero. &ultimo)). Anadir(&primero. &ultimo)). &ultimo)). printf("Leer: %d\n". &ultimo. printf("Añadir(20)\n"). pNodo *ultimo). printf("Añadir(90)\n").

ahora primero apuntará también al nuevo nodo */ if(!*primero) *primero = nuevo. /* Guardamos el valor de retorno */ v = nodo->valor. /* Si primero es NULL. /* Borrar el nodo */ free(nodo). if(!nodo) return 0. añadimos el nuevo a continuación de ultimo */ if(*ultimo) (*ultimo)->siguiente = nuevo. el último elemento de la cola es el nuevo nodo */ *ultimo = nuevo. return v. . } int Leer(pNodo *primero. ultimo debe ser NULL también*/ if(!*primero) *ultimo = NULL. /* Ahora. pNodo *ultimo) { pNodo nodo. /* Si la cola quedó vacía./* Si la cola no estaba vacía. } PROFESOR(A): ING. /* variable auxiliar para retorno */ /* Nodo apunta al primer elemento de la pila */ nodo = *primero. /* variable auxiliar para manipular nodo */ int v. la cola estaba vacía. /* Si no hay nodos en la pila retornamos 0 */ /* Asignamos a primero la dirección del segundo nodo */ *primero = nodo->siguiente. YOHENI GONZALEZ.