Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЗадачникПоТПиРнаЭВМ.doc
Скачиваний:
28
Добавлен:
11.03.2016
Размер:
1 Mб
Скачать

11.2. Очереди

Очередь – это связный список, закон построения которого следующий: новый элемент всегда ставится в конец списка, а удаление элемента происходит из его начала [4, 32]. Таким образом, очередь является структурой данных, которые организованы по принципу FIFO (First In, First Out) – «Первый пришел – первый вышел». Чтобы не ограничивать максимальное число элементов в очереди, очередь может быть реализована в виде однонаправленного списка. В этом случае объекты очереди имеют такую же структуру, как и объекты однонаправленного списка. Часть полей описывает характеристики конкретного объекта и есть поле типа указатель, которое содержит адрес следующего в очереди элемента.

С очередью связаны два указателя. Один содержит адрес объекта, находящегося в начале очереди, а другой хранит адрес последнего объекта очереди. Первый из них назовем begin, а второй end.

Листинг 11.2. В программе создается очередь из некоторых заданий, характеризующихся номером и длиной выполнения. Структуру этих объектов можно описать так:

struct ochered {

int number; //Номер задания

int count; //Объем задания

ochered *next; //Указатель на следующий элемент

};

Задания добавляются в очередь и удаляются из очереди.

Файл stdafx.h

#pragma once

#define WIN32_LEAN_AND_MEAN

#include <stdio.h>

#include <tchar.h>

#include <iostream>

using namespace std;

Файл “Och.h”

struct ochered

{

int number; //Номер задания

int count; //Объем задания

ochered *next; //Указатель на следующий элемент

};

// Прототип функции постановки задания в очередь:

void add_ochered(ochered **begin, ochered **end, int nn, int dl);

//Прототип функции удаления задания из очереди:

void del_ochered(ochered **begin, ochered **end);

// Прототип функции печати содержимого очереди:

void print_ochered(ochered *begin);

Файл “Och.cpp”

#include "stdafx.h"

#include "Och.h"

void add_ochered(ochered **begin, ochered **end, int nn, int dl)

{

ochered *new_el;

//Создание нового элемента:

new_el=new ochered;

(*new_el).number=nn;

(*new_el).count=dl;

(*new_el).next=NULL;

if(*begin==NULL)

{

//Очередь пуста.Элемент добавляется как единственный:

(*begin)=(*end)=new_el;

return;

}

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

(**end).next=new_el;

(*end)=new_el;

}

void del_ochered(ochered **begin, ochered **end)

{

ochered *ptr;

ptr=*begin;

if(*begin==NULL)

{

//Очередь пуста:

cout<<"Очередь пуста";

return;

}

//Передвигается начало очереди:

(*begin)=(**begin).next;

//Освобождается место удаляемого элемента:

delete ptr;

}

void print_ochered(ochered *begin)

{

ochered *ptr=begin;

cout<<" Номер задания | Его длина"<<'\n';

while(ptr!=NULL)

{

cout.width(12);

cout<<(*ptr).number;

cout.width(18);

cout<<(*ptr).count<<'\n';

ptr=(*ptr).next;

}

}

//L11_2.cpp

#include "stdafx.h"

#include "Och.h"

int _tmain( )

{

ochered *begin, *end;

int nn,dl;

setlocale(LC_CTYPE,"rus");

begin=end=NULL;

//Постановка задания в очередь:

cout<<"Введите номер задания и его длину ";

cin>>nn>>dl;

cout<<"Если хотите прекратить ввод введите номер и длину нулевыми\n";

do

{

add_ochered(&begin, &end, nn, dl);

cout<<"Введите номер задания и его длину ";

cin>>nn>>dl;

}while(nn!=0);

print_ochered(begin);

//Удаляется задание из очереди:

del_ochered(&begin, &end);

print_ochered(begin);

cin.get();

cin.get();

return 0;

}

Результат выполнения программы листинга 11.2 представлен на рис. 11.7.

Рис. 11.7. Результат работы программы листинга 11.2