Queue_List.H
#ifndef _QUEUE_LIST_H_
#define _QUEUE_LIST_H_
#include "List_One.h"
/*Описание исключительных ситуаций*/
constintqueueListOk = listOneOK;
const int queueListEmpty = listOneEmpty;
const int queueListNoMem = listOneNoMem;
\
/*Переменная ошибок*/
externintlistOneError;
/*Базовый тип очереди на списке*/
typedef listOneBaseType QueueListBaseType;
/*Тип очереди на списке*/
typedefListOne QueueList;
/*Функции работы со очередью*/
void initQueueList(QueueList *S); // Инициализация очереди
void putQueueList(QueueList *S, QueueListBaseType E); // Включение в очередь
void getQueueList(QueueList *S, QueueListBaseType *E); // Исключение из очереди
void doneQueueList(QueueList *L); // Удаление очереди
int isEmptyQueueList(QueueList *S); // Предикат: пуста ли очередь
#endif
Queue_List.H
#include "Queue_List.h"
/*Инициализация очереди*/
void initQueueList(QueueList *S) {
initListOne(S);
listOneError=queueListOk;
}
/*Включение в очередь*/
void putQueueList(QueueList *S, QueueListBaseType E) {
endPtrListOne(S);
putListOne(S, E);
listOneError=queueListNoMem;
}
/*Исключение из очереди*/
void getQueueList(QueueList *S, QueueListBaseType *E) {
beginPtrListOne(S);
getListOne(S, E);
listOneError = listOneEmpty;
}
/*Удаление очереди*/
void doneQueueList(QueueList *L) {
doneListOne(L);
}
/*Предикат: пуста ли очередь*/
int isEmptyQueueList(QueueList *S) {
return isEmptyListOne(S);
}
Модуль очереди с приоритетом:
QueuePriority.H
#ifndef _QUEUE_PRIORITY_H_
#define _QUEUE_PRIORITY_H_
/*Размер очереди*/
#define SIZE_QUEUE_PRIORITY 5
/*Описание исключительных ситуаций*/
const int okQueuePriority = 0; // Все нормально
const int fullQueuePriority = 1; // Очередь переполнена
const int emptyQueuePriority = 2; // Очередь пуста
/*Переменная ошибок*/
extern int errorQueuePriority;
/*Базовый тип очереди*/
typedef struct {
int data; // Данные
int priority; // Приоритет
} queuePriorityBaseType;
/*Дескриптор очереди*/
typedef struct {
queuePriorityBaseType buf[SIZE_QUEUE_PRIORITY]; // Буфер очереди
unsigned uk; // Указатель на хвост
} QueuePriority;
/*Функции работы с очередью*/
void initQueuePriority(QueuePriority *F); // Инициализация очереди
void putQueuePriority(QueuePriority *F, queuePriorityBaseType E); // Включение в очередь
void getQueuePriority(QueuePriority *F, queuePriorityBaseType *E); // Исключение из очереди
int isFullQueuePriority(QueuePriority *F); // Предикат: полна ли очередь
int isEmptyQueuePriority(QueuePriority *F); // Предикат: пуста ли очередь
#endif
QueuePriority.С
#include <stdio.h>
#include "QueuePriority.h"
/*Переменная ошибок*/
int errorQueuePriority;
/*Инициализация очереди*/
void initQueuePriority(QueuePriority *F) {
F->uk = 0;
errorQueuePriority = okQueuePriority;
}
/*Включение в очередь*/
void putQueuePriority(QueuePriority *F, queuePriorityBaseType E) {
/*Если очередь переполнена*/
if (isFullQueuePriority(F)) {
return;
}
/*Иначе*/
F->buf[F->uk] = E;
F->uk++;
}
/*Исключение из очереди*/
void getQueuePriority(QueuePriority *F, queuePriorityBaseType *E) {
/*Если очередь пуста*/
if (isEmptyQueuePriority(F)) {
return;
}
/*Иначе поиск элемента с максимальным приоритетом*/
queuePriorityBaseType max = F->buf[0]; // Максимальным примем 1-й элемент
int maxPos = 0; // Позиция элемента в макс. приоритетом
for (unsigned i = 1; i < F->uk; i++) { // Для всех элементов начиная со второго выполнить
if (F->buf[i].priority > max.priority) { // поиск элемента с максимальным приоритетом
max = F->buf[i];
maxPos = i;
}
}
/*Максимальный найден. Производим исключение*/
*E = max; // Запись данных в переменную
F->buf[maxPos] = F->buf[--F->uk]; // Установка на позицию исключаемого элемента последнего
// Уменьшение длины очереди
}
/*Предикат: полна ли очередь*/
int isFullQueuePriority(QueuePriority *F) {
if (F->uk == SIZE_QUEUE_PRIORITY) {
errorQueuePriority = fullQueuePriority;
return 1;
}
return 0;
}
/*Предикат: пуста ли очередь*/
int isEmptyQueuePriority(QueuePriority *F) {
if (F->uk == 0) {
errorQueuePriority = emptyQueuePriority;
return 1;
}
return 0;
}
Модуль ОЛС, расположенного в динамической памяти: