- •Разработка подпрограммы включения элемента в дек
- •I. Спецификация
- •II. Метод решения
- •III. Информационная модель
- •V. Программная модель
- •Разработка подпрограммы исключения элемента из дека
- •I. Спецификация
- •Перечень параметров
- •II. Метод решения
- •III. Информационная модель
- •V. Программная модель
- •Разработка подпрограммы просмотра дека
- •I. Спецификация
- •Вид: процедура
- •Перечень параметров
- •II. Метод решения
- •III. Информационная модель
- •V. Программная модель
- •Программа, моделирующая работу с деком
Для ознакомления работы с деками рассмотрим следующую задачу: разработать программу, обеспечивающую включение элементов в дек, исключение из него элементов и вывод на экран содержимого дека. В качестве дека будем использовать двунаправленный циклический список.
Для разработки предлагается следующая структура программы
|
|
dek |
|
|
Программа работы с деком |
||||
|
|
|
|
|
vkldek |
|
iskldek |
|
printdek |
П/п включения нового элемента в дек |
П/п исключения элемента из дека |
П/п вывода содержимого дека на экран |
Дек представляет собой следующую структуру
Элементом дека является запись, состоящая из трех полей. Первое поле – информационное (inf:tinf), второе и третье – ссылочные поля, указывающие на следующий и предыдущий элементы дека (psled, ppred: tpel, где tpel – ссылочный тип на тип элемента дека)
type
tinf=integer;
tpel=^tel;
tel=record
inf:tinf;
psled,ppred:tpel
end;
Доступ к элементам дека возможен как из "головы", так и из "хвоста", то есть включать и исключать элементы можно как в(из) начало списка, так и в(из) конец.
Разработка подпрограммы включения элемента в дек
I. Спецификация
-
Назначение: создание динамической переменной типа tel и включение ее в начало или конец двунаправленного циклического списка
-
Имя: vkldek
-
Вид: процедура
-
Перечень параметров
Статус |
Назначение |
Имя |
Тип |
Вид |
Вход/выход |
голова списка |
head |
tpel |
параметр-переменная |
Вход |
информация, включаемая в список |
inf |
tinf |
параметр-значение |
Вход |
место включения в список (true – включение в голову списка; false – включение в хвост списка) |
mesto |
boolean |
параметр-значение |
где type tinf=integer;
tpel=^tel;
tel=record
inf:tinf;
psled,ppred:tpel
end;
-
Заголовок подпрограммы:
procedure vkldek(var head:tpel; inf:tinf; mesto:boolean);
II. Метод решения
1. Создание динамической переменной со структурой элемента списка new(tek);
2. Заполнение информационной части нового элемента tek^.inf:=inf;
3. Формирование связей между элементами списка. Если список пуст (head=nil),
то голова указывает на новый элемент, а сам элемент ссылается обоими указателями сам на себя:
Если список не пуст:
то формируются указатели нового элемента –указатель на предыдущий совпадает с указателем, занесенным в голову; указатель на следующий определяется указателем на предыдущий первого элемента списка (на первый элемент списка указывает голова). Затем формируются указатели соседних с новым элементов - предыдущий и следующий элемент соответствующими указателями ссылаются на новый элемент:
Все эти действия можно описать следующим образом:
4. Если включается новый элемент в голову списка, то изменяется значение головы
III. Информационная модель
Назначение |
Имя |
Тип |
Указатель на новый элемент |
tek |
tpel |
V. Программная модель
procedure vkldek(var head:tpel;inf:tinf;mesto:boolean);
var tek:tpel;
begin
new(tek);
tek^.inf:=inf;
if head=nil then
begin
head:=tek;
tek^.ppred:=tek;
tek^.psled:=tek
end
else
begin
tek^.psled:=head;
tek^.ppred:=head^.ppred;
tek^.ppred^.psled:=tek;
tek^.psled^.ppred:=tek
end;
if mesto then head:=tek
end;
Разработка подпрограммы исключения элемента из дека
I. Спецификация
-
Назначение: исключение из начала или конца двунаправленного циклического списка очередного элемента
-
Имя: iskldek
-
Вид: функция
-
Перечень параметров
Статус |
Назначение |
Имя |
Тип |
Вид |
Вход/выход |
голова списка |
head |
tpel |
параметр-переменная |
Выход |
информация, хранящаяся в исключаемом элементе |
inf |
tinf |
параметр-переменная |
Вход |
место исключения из списка (true – исключение из головы списка; false – исключение из хвоста списка) |
mesto |
boolean |
параметр-значение |
Возвращаемое значение |
признак выполнения операции (true – операция выполнена успешно; false – операцию выполнить невозможно, так как список пуст) |
iskldek |
boolean |
- |
где type tinf=integer;
tpel=^tel;
tel=record
inf:tinf;
psled,ppred:tpel
end;
-
Заголовок подпрограммы:
function iskl(var head:tpel;var inf:tinf;mesto:boolean):boolean;