Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Set 4.docx
Скачиваний:
0
Добавлен:
04.02.2020
Размер:
1.33 Mб
Скачать

Применение очередей

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

Формирование очереди

Формирование очереди состоит из двух этапов: создание первого элемента, добавление нового элемента в конец очереди.

Создание первого элемента очереди

Этот этап заключается в создании первого элемента, для которого адресная часть должна быть нулевой (^ NULL). Для этого нужно:

1) ввести информацию для первого элемента (целое число i);

2) захватить память, используя текущий указатель:

t = (Spis*) malloc(sizeof(Spis)); или t = new Spis;

в результате формируется конкретный адрес (^ А1) для первого элемента;

3) сформировать информационную часть:

t -> info = i; (обозначим i1 )

4) в адресную часть занести NULL:

t -> Next = NULL;

5) указателям на начало и конец очереди присвоить значение t:

begin = end = t;

На этом этапе получим следующее:

Добавление элемента в очередь

Рассмотрим алгоритм добавления только для второго элемента.

1. Ввод информации для текущего (второго) элемента – значение i .

2. Захватываем память под текущий элемент:

t = (Spis*) malloc (sizeof(Spis)); или t = new Spis;

3. Формируем информационную часть (обозначим i2):

t -> info = i;

4. В адресную часть созданного элемента (текущего) заносим NULL, т.к. этот элемент становится последним:

t -> Next = NULL;

5. Элемент добавляется в конец очереди, поэтому в адресную часть бывшего последнего элемента end заносим адрес созданного:

end -> Next = t;

бывший последний элемент становится предпоследним.

6. Переставляем указатель последнего элемента на добавленный:

end = t;

В результате получим

Для добавления в очередь любого количества элементов организуется цикл, включающий пункты 1– 6 рассмотренного алгоритма. Завершение цикла реализуется в зависимости от поставленной задачи.

Обобщим рассмотренные этапы, тогда функция формирования очереди из данных объявленного типа с добавлением новых элементов в конец может иметь следующий вид:

void Create(Spis **begin, Spis **end) {

Spis *t = (Spis*) malloc(sizeof(Spis));

printf(“\n Input Info ”);

scanf(“%d”, &t -> info);

t -> Next = NULL;

if(*begin == NULL) // Формирование первого элемента

*begin = *end = t;

else {

(*end) -> Next = t; // Добавление в конец

*end = t;

}

}

Алгоритм удаления первого элемента из очереди

Предположим, что очередь создана, т.е. begin не равен NULL (рекомендуется организовать проверку на равенство NULL с соответствующей обработкой данной ситуации).

1. Устанавливаем текущий указатель на начало очереди: t = begin;

2. Обрабатываем информационную часть первого элемента очереди, например, выводим на экран.

3. Указатель на начало очереди переставляем на следующий (2-й) элемент

begin = begin->Next;

4. Освобождаем память, захваченную под 1-й элемент: free(t);

5. Выводим сообщение, например, «Элемент удален!».

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]