Está en la página 1de 6

Programación II

TAD Cola de Prioridad - Un Ejemplo de


Implementación
Ejemplo de implementación de Colas de Prioridad Programación II
Facultade de Informática de A Coruña 1
2

Programación II
/* dynamic_queue.h /* ordered_list.h
* TAD Cola con implementación dinámica */ * TAD Lista Ordenada */

#ifndef DYNAMIC_QUEUE_H #include ”dynamic queue.h”


#define DYNAMIC_QUEUE_H
#define LNULL NULL
#include <stdbool.h> #define MAXPRIO = ...
Facultade de Informática de A Coruña

typedef ... tItemQ; typedef unsigned char tPriority


typedef struct tNodeQ *tPosQ;
struct tNodeQ { typedef struct ItemL {
tItemQ item; tPriority prio;
tPosQ next; tQueue queue;
}; } tItemL;
typedef struct Queue {
tPosQ front; typedef struct tNodeL *tPosL;

Ejemplo de implementación de Colas de Prioridad


tPosQ rear; struct tNodeL {
} tQueue; tItemL data;
tPosL next;
};
void createEmptyQueue(tQueue *Q); typedef tPosL tOrderedList;
bool enqueue(tItemQ d, tQueue *Q);
void dequeue(tQueue *Q);
tItemQ front(tQueue Q); tPosL findItem (tPriority prio, tList L);
bool isEmptyQueue(tQueue Q); bool insertItem (tPriority prio, tList *L);
void getItem (tPosL p, tList L, tPriority *prio, tQueue *queue);
#endif // DYNAMIC_QUEUE_H void updateItem (tOrderedList *L, tPosL p, tQueue queue);

En gris, los detalles de la Lista Ordenada necesarios para usarla como parte de la Cola de Prioridad.
Ejemplo de implementación de Colas de Prioridad Programación II

/* priority_queue.h
* TAD Cola de Prioridad */

#include ”ordered list.h”


#include ”dynamic queue.h”

typedef tOrderedList tQueueP;

void createEmptyQueueP (tQueueP *queueP);


bool enqueueP (tItemQ item, tPriority prio, tQueueP *queueP);
void dequeueP (tQueueP *queueP);
bool isEmptyQueueP (QueueP queueP);
tItemQ frontP (QueueP queueP);

Facultade de Informática de A Coruña 3


Programación II Ejemplo de implementación de Colas de Prioridad

/* priority_queue.h
* TAD Cola de Prioridad */

#include ”ordered list.h”


#include ”dynamic queue.h”

typedef tOrderedList tQueueP;

void createEmptyQueueP (tQueueP *queueP);


bool enqueueP (tItemQ item, tPriority prio, tQueueP *queueP);
void dequeueP (tQueueP *queueP);
bool isEmptyQueueP (QueueP queueP);
tItemQ frontP (QueueP queueP);

/* priority_queue.c
* Implementación de TAD Cola de Prioridad */

bool enqueueP (tItemQ item, tPriority prio, tQueueP *queueP);


/* PreCondición: (Para ejercicio en clase) Se supone memoria suficiente para
realizar la operación */
{
tPosL pos;
tQueue Q;

// Existe esa prioridad?


pos = findItem (prio, *queueP);

if (pos == LNULL) {
// No existe => a~
nadirla
insertItem (prio, queueP);
pos = findItem (prio, *queueP);
}

// Recuperar la cola para a~nadir el dato


getItem (pos, *queueP, &prio, &Q);

// Actualizar
enqueue (item, &Q);
updateItem (queueP, pos, Q);
// Sin restricciones de memoria. Devolvemos siempre TRUE
return true;
}

4 Facultade de Informática de A Coruña


Ejemplo de implementación de Colas de Prioridad Programación II

void dequeueP (tQueueP *queueP)


/* PreCondición: La Cola de Prioridad no está vacı́a */
{
tPosL posL;
tItemL itemL;
tQueue queue;
tPriority priority;

// Eliminamos el frente de la cola de máxima prioridad


posL = first (L);
getItem (posL, *queueP, &priority, &queue);
dequeue (&queue);
// Si la Cola queda vacı́a, se elimina también el nodo de la lista
if (isEmptyQueue(queue))
deleteAtPosition (posL, queueP);
else
updateItem (queueP, posL, queue);
}

Facultade de Informática de A Coruña 5

También podría gustarte