Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование4172 / Лекции / Лекция 18. Очереди.doc
Скачиваний:
51
Добавлен:
12.03.2015
Размер:
99.84 Кб
Скачать
  1. Инициализация (создание пустой очереди)

un = uk = 0;

  1. Исключение элемента из очереди с присвоением его значения переменной X

if (un != uk) /* очередь не пустая*/

{ X = Och [un];

if (un < N) un++; else un = 0;

}

или

if (un != uk)

{ X = Och [un++];

if (un > N) un = 0;

}

  1. Включение в очередь элемента X

int i; /* значение указателя конца после включения элемента */

if (uk<N) i = uk +1;

else i = 0;

if (i != un) /* есть место в векторе */

{ Och [uk] = X;

uk = i;

}

else … /* очередь переполнена */

Представление очереди в виде списка

Очередь можно хранить в виде списка с двумя указателями: начала и конца очереди (рис. 18.3).

1-й эл-т 2-й эл-т n-й эл-т

указатель указатель

начала конца

Рис. 18.3. Очередь в виде списка

Программирование операций на языке С (C++)

  1. Описание очереди

/* тип элемента очереди */

struct EL_OCH

{ тип_элемента inf; /* значение элемента (поле информации) */

struct EL_OCH * sled; /* ссылка на следующий элемент */

};

struct EL_OCH *un, *uk; /* указатели начала и конца очереди */

  1. Инициализация (создание пустой очереди)

un = uk = NULL;

  1. Исключение элемента из очереди с присвоением его значения переменной X

а) Если в очереди больше одного элемента, нужно переменной X присвоить значение 1-го элемента, указателю начала присвоить адрес 2-го элемента и освободить память, занятую 1-м элементом (рис. 18.4).

inf sled

un uk

Рис. 18.4. Исключение элемента из очереди, состоящей из двух и более элементов

б) Если в очереди всего один элемент, нужно X присвоить значение этого элемента и освободить память, выделенную под элемент, затем обнулить оба указателя (рис. 18.5).

inf sled

un uk

Рис. 18.5. Исключение элемента из очереди, состоящей из одного элемента

Операцию исключения элемента из очереди оформим как отдельную функцию.

/* Вызов функции*/

if ( !Iskluch (&un, &uk, &X) ) puts(“Очередь была пустая”);

/* Функция исключения элемента из очереди*/

int Iskluch(struct EL_OCH **p_un, struct EL_OCH **p_uk, тип_элемента *pX)

/* p_un – указатель на un */

/* p_uk – указатель на uk */

/* pX – указатель на X */

/* Функция возвращает 1 в случае успешного выполнения и 0, если очередь была пустая.*/

{ struct EL_OCH *i;

if (*p_un != NULL) /* очередь не пустая*/

{ i = *p_un;

*pX = i -> inf;

*p_un = i -> sled;

free (i);

if (*p_un == NULL) /* в очереди был один элемент */

*p_uk = NULL;

return 1;

}

return 0;

}

  1. Включение в очередь элемента, равного X.

Нужно выделить память под новый элемент и записать в его поле информации значение X, а в поле ссылки – 0. Затем добавить новый элемент в конец очереди и изменить указатель конца (рис. 18.6). Если очередь была пустой, то нужно изменить и указатель начала, чтобы он тоже ссылался на новый элемент (рис. 18.7).

inf sled новый эл-т

un uk i

Рис. 18.6. Включение нового элемента в непустую очередь

новый эл-т

un uk

Рис. 18.7. Включение в пустую очередь нового элемента

Операцию включения элемента в очередь оформим как отдельную функцию.

/* Вызов функции*/

Vkluch (&un, &uk, X);

/* Функция включения элемента в очередь*/

void Vskluch (struct EL_OCH **p_un, struct EL_OCH **p_uk, тип_элемента X)

/* p_un – указатель на un */

/* p_uk – указатель на uk */

/* X – значение включаемого элемента */

{ struct EL_OCH *i; /* указатель на новый элемент */

i = (struct EL_OCH *) malloc (sizeof (struct EL_OCH));

i -> inf = X;

i -> sled = NULL;

if (*p_un != NULL) /* очередь не пустая*/

(*p_uk) -> sled = i;

else *p_un = i;

*p_uk = i;

}

Представление очереди в виде списка удобно для очереди трудно предсказуемого размера и для очереди с приоритетами. В очереди с приоритетами исключение элементов происходит не в порядке поступления, а по приоритету (старшинству). Для этого элементы упорядочиваются в очереди по убыванию приоритета, т.е. включаются не обязательно в конец, что удобно делать в списке. Каждый элемент очереди содержит, кроме полей информации и указателя на следующий элемент, поле приоритета (целое число).