Sie sind auf Seite 1von 7

2013

ESTRUCTURAS DINMICAS
DE DATOS (COLAS) EN C

Departamento de Computacin
UNAN-Len
Estructuras Dinmicas de Datos (Colas)

TEMA 5: ESTRUCTURAS DINMICAS DE DATOS (COLAS)

5.1 INTRODUCCIN:

Las colas son secuencias de elementos caracterizadas


porque las operaciones de insercin y borrado se realizan
sobre extremos opuestos de la secuencia. La insercin 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 extrado 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 irn saliendo de la cola
en el orden en que entraron. Por esa razn, 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 aplicacin habitual en muchos problemas
informticos. Quizs la aplicacin ms comn de las colas es la organizacin 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 continuacin. Todo
esto suponiendo la ausencia de prioridades en los trabajos. En caso contrario, existir una
cola para cada prioridad.

El smil cotidiano es una cola para comprar, por ejemplo, las entradas del cine. Los nuevos
compradores slo pueden colocarse al final de la cola, y slo el primero de la cola puede
comprar la entrada.

Los tipos que definiremos normalmente para manejar colas sern casi los mismos que para
manejar listas y pilas, tan slo cambiaremos algunos nombres:

typedef struct _nodo


{
int dato;
struct _nodo *siguiente;
} tipoNodo;

2
Estructuras Dinmicas de Datos (Colas)

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. Adems, debido al funcionamiento de las colas, tambin 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 ms fcil ser insertar nodos por el final, a continuacin 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 BSICAS CON COLAS:

De nuevo nos encontramos ante una estructura con muy pocas operaciones disponibles. Las
colas slo permiten aadir 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, prcticamente no hay casos especiales, salvo
que la cola est vaca.

Aadir elemento en una cola vaca:

Partiremos de que ya tenemos el nodo a insertar y, por supuesto un puntero que apunte a l,
adems los punteros que definen la cola, primero y ltimo que valdrn NULL:

El proceso es muy simple, bastar con que:


nodo->siguiente apunte a NULL.
Y que los punteros primero y ltimo apunten a nodo.

Aadir elemento en una cola no vaca:

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 vaca, los punteros primero y ltimo no sern nulos:

El proceso sigue siendo muy sencillo:


Hacemos que nodo->siguiente apunte a NULL.
Despus que ultimo->siguiente apunte a nodo.
Y actualizamos ltimo, haciendo que apunte a nodo.
3
Estructuras Dinmicas de Datos (Colas)

Aadir elemento en una cola, caso general:

Para generalizar el caso anterior, slo necesitamos aadir una operacin:


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 vaca, as que haremos que primero
apunte tambin a nodo.

5.2.3 DESENCOLAR UN ELEMENTO:

Recordemos que leer un elemento de una cola, implica eliminarlo. Ahora tambin existen dos
casos, que la cola tenga un solo elemento o que tenga ms 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 direccin del segundo nodo de la pila: primero->siguiente.
Guardamos el contenido del nodo para devolverlo como retorno, recuerda que la
operacin de lectura en colas implica tambin borrar.
Liberamos la memoria asignada al primer nodo, el que queremos eliminar.

Leer un elemento en una cola con un solo elemento:

Tambin 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 direccin del segundo nodo terico de la cola:
primero->siguiente.
Guardamos el contenido del nodo para devolverlo como retorno, recuerda que la
operacin de lectura en colas implica tambin 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 vaca.

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 direccin del segundo nodo de la pila: primero->siguiente.
Guardamos el contenido del nodo para devolverlo como retorno, recuerda que la
operacin de lectura en colas implica tambin borrar.
Liberamos la memoria asignada al primer nodo, el que queremos eliminar.
Si primero es NULL, hacemos que ultimo tambin apunte a NULL, ya que la lectura
ha dejado la cola vaca.

4
Estructuras Dinmicas de Datos (Colas)

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("Aadir(20)\n");

Anadir(&primero, &ultimo, 10);


printf("Aadir(10)\n");

printf("Leer: %d\n", Leer(&primero, &ultimo));


Anadir(&primero, &ultimo, 40);

printf("Aadir(40)\n");
Anadir(&primero, &ultimo, 30);
printf("Aadir(30)\n");

printf("Leer: %d\n", Leer(&primero, &ultimo));


printf("Leer: %d\n", Leer(&primero, &ultimo));
Anadir(&primero, &ultimo, 90);

printf("Aadir(90)\n");
printf("Leer: %d\n", Leer(&primero, &ultimo));
printf("Leer: %d\n", Leer(&primero, &ultimo));

system("PAUSE");
return 0;
}

5
Estructuras Dinmicas de Datos (Colas)

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 vaca, aadimos el nuevo a continuacin 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 vaca, ahora primero apuntar


tambin 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 direccin del segundo nodo */


*primero = nodo->siguiente;

/* Guardamos el valor de retorno */


v = nodo->valor;

/* Borrar el nodo */
free(nodo);
/* Si la cola qued vaca, ultimo debe ser NULL tambin*/
if(!*primero)
*ultimo = NULL;
return v;
}

6
Estructuras Dinmicas de Datos (Colas)

EJERCICIO PROPUESTO:

Realice un programa Agenda que almacene en una cola las actividades del da, el programa
deber permitir:
Insertar una actividad.
Borrar una actividad.
Ver todas las actividades del da.

A dems de realizar estas funciones deber crear una funcin para asignar memoria a la
nueva actividad y otra funcin que borre todos los elementos, esta ltima funcin se realiza
para liberar toda la memoria asignada dinmicamente.

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...
};

Das könnte Ihnen auch gefallen