Лаб раб 13П 2013

advertisement
Лабораторная работа № 13П
Динамические структуры данных переменного размера (связанные списки).
Задание к лабораторной работе № 13П
1. Составить и отладить программу Svyaz формирования связанного списка в ходе ввода
данных c клавиатуры.
2. Предъявить отлаженную программу Svyaz преподавателю, выполнить индивидуальное
задание и ответить на вопросы по теме лабораторной работы.
Краткие теоретические сведения
В динамической памяти можно создать структуру данных переменного размера. В
данной лабораторной работе рассмотрен именно этот случай.
Связанные списки. Пусть в процессе физического эксперимента многократно
снимаются показания прибора (допустим, термометра) и записываются в компьютерную
память для дальнейшей обработки. При этом заранее неизвестно, сколько будет
произведено измерений, т.е. объем данных заранее неизвестен.
Если для обработки таких данных не использовать внешнюю память (файлы), то
разумно расположить их в динамической памяти. Во-первых, динамическая память
позволяет хранить больший объем информации, чем статическая. Во-вторых, в динамической памяти эти числа можно организовать в связанный список, который не требует
предварительного указания количества чисел подобно массиву. Что же такое связанный
список? Схематически его можно представить следующим образом (рис. 4):
Рис. 4. Схема связанного списка.
Каждый элемент списка состоит из двух частей: информационной (х1, х2,...) и
указателя на следующий элемент (р 2 , р 3 ...). Последний элемент имеет пустой указатель
Nil. Связанный список такого типа называется однонаправленной цепочкой.
В сформулированной задаче информационная часть содержит следующие
вещественные числа: х1 — результат первого измерения; х2 — результат второго
измерения; х3 — результат третьего измерения; х4 — результат последнего измерения.
1
Лаб 13Л
Связанный список обладает тем замечательным свойством, что его можно дополнять по
мере поступления новой информации. Дополнение происходит присоединением нового
элемента к концу списка, а значение Nil в последнем элементе заменяется ссылкой на новый элемент цепочки (рис. 5):
Рис. 5. Схема связанной цепочки после добавления элемента х5.
В программе для представления элементов цепочки используется комбинированный
тип данных — запись. В нашем примере тип такого элемента может быть следующим:
Туре Ре = ^Elem;
Elem = Record
T : Real;
P : Pe
End;
Здесь Ре — это ссылочный тип на переменную типа Elem. Этим именем обозначен
комбинированный тип, состоящий из двух полей: Т — вещественной величины, хранящей
значение температуры, и Р — указателя на динамическую величину типа Elem.
В данном описании нарушен один из основных принципов языка Паскаль, согласно
которому на любой программный объект можно ссылаться только после его описания. В
самом деле, тип Ре определяется через тип Elem, который, в свою очередь, определяется
через тип Ре. Однако в Паскале существует единственное исключение из этого правила,
связанное со ссылочным типом. Приведенный фрагмент программы является правильным.
Однонаправленная цепочка — простейший вариант связанного списка. В практике
программирования используются также двунаправленные цепочки (когда каждый элемент
хранит указатель на следующий и предыдущий элементы списка) и двоичные деревья.
Подобные структуры данных называются динамическими.
Стек. Одной из часто употребляемых в программировании динамических структур
данных является стек. Стек — это связанная цепочка, начало которой называется
вершиной и состав элементов которой постоянно меняется. Каждый вновь поступающий
элемент устанавливается в вершине стека. Удаление элементов из стека также
производится с вершины.
Стек подобен детской пирамидке, в которой на стержень надеваются кольца. Всякое
новое кольцо оказывается на ее вершине. Снимать кольца можно только сверху. Принцип
2
Лаб 13Л
изменения содержания стека часто формулируют как «последним пришел — первым
вышел»
Рассмотрим пример работы со стеком. Для этого составим процедуры добавления
элемента в стек (INSTEK) и исключения элемента из стека (OUTSTEK), при условии, что
эти элементы — символьные величины.
В процедурах используется тип данных Ре, который должен быть глобально
объявлен в основной программе:
Туре Ре = ^ТурЕlеm;
TypElem = Record
С : Char; Р : Ре
End;
В приведенной далее процедуре INSTEK аргументом является параметр Sim,
содержащий включаемый в стек символ. Ссылочная переменная Beg содержит указатель
на вершину стека при входе в процедуру и при выходе из нее. Следовательно, этот параметр является и аргументом, и результатом процедуры. В случае, когда стек пустой,
указатель Beg равен Nil.
Procedure INSTEK (Var Beg : Ре; Sim : Char);
Var X : Pe;
Begin New(X);
Х^.С := Sim;
Х^.Р := Beg;
Beg := X
End;
В приведенной далее процедуре OUTSTEK параметр Beg играет ту же роль, что и в
предыдущей процедуре, т.е. после удаления последнего символа его значение станет
равным Nil. Ясно, что если стек пустой, то удалять из него нечего. Логический параметр
Flag позволяет распознать этот случай: если на выходе из процедуры Flag = True, это
значит, что удаление произошло, а если Flag = False, это значит, что стек был пуст и
ничего не изменилось.
Procedure OUTSTEK (Var Beg : Pe; Var Flag : Boolean);
Var X : Pe;
Begin
If Beg = Nil
Then Flag := False
3
Лаб 13Л
Else Begin
Flag := True;
X := Beg;
Beg := Beg^.P;
DISPOSE(X)
End
End;
Данная процедура не оставляет после себя «мусора», освобождая память от
удаленных элементов.
Порядок выполнения задания к лабораторной работе № 13П
1. На основании теоретических сведений и в соответствии с п. 1. Задания к лабораторной
работе № 13П составьте и отладьте программу с именем Svyaz, формирующую
связанный список в ходе ввода данных c клавиатуры. Каждый элемент цепочки
представляет собой запись (комбинированный тип), аналогичную описанной в
примере на стр. 2:
Туре Ре = ^Elem;
Elem = Record
T : Real;
P : Pe
End;
В качестве значений Т можно использовать произвольные значения температур в виде
ряда вещественных чисел 18, 5; 17,4; 18,1; 19,2; 18,7; 17,8; 18,0; 18,3; 19,1; 18,9 (всего
10 – 12 значений, группирующихся вокруг некоторого значения).
2. Вначале программа Svyaz должна определить адрес начала связанной цепочки и
сохранить его в какой-нибудь переменной.
3. После этого программа Svyaz должна обеспечить ввод в диалоговом режиме с
клавиатуры числовых значений температур. Диалоговый режим здесь нужен для того,
чтобы в любой момент можно было прекратить ввод значений, т.е. перед каждым
вводом (кроме первого) программа должна запрашивать согласие пользователя на ввод
очередного значения и в случае отказа выводить сообщение о завершении ввода.
4. После завершения ввода программа Svyaz должна вывести на экран введенную
числовую последовательность для контроля правильности ввода.
4
Лаб 13Л
5. После составления и отладки своей программы для проверки правильности сравните
ее с одним из возможных вариантов программы, приведенным ниже.
Program Svyaz;
Туре Ре = ^ТурЕlem;
TypElem = Record
Т : Real; Р : Ре
End;
Var Elem, Beg : Ре;
X : Real; Ch : Char;
Begin
{Определение адреса начала списка и его сохранение}
NEW (Elem);
Beg := Elem;
Elem^.P := Elem;
{Диалоговый ввод значений с занесением их в список
и организацией связи между элементами}
While Elem^.Р <> Nil Do
Begin
Write('Вводите число: '); ReadLn (Elem^.Т);
Write('Повторить ввод? (Y/N)'); ReadLn (Ch);
If (Ch = 'n') Or (Ch = 'N')
Then Elem^.P := Nil
Else Begin
NEW (Elem^.P);
Elem := Elem^.P
End
End;
WriteLn ('Ввод данных закончен);
{Вывод полученной числовой последовательности}
WriteLn ('Контрольная распечатка');
Elem := Beg;
Repeat
5
Лаб 13Л
WriteLn (N, ' : ', Elem^.Т : 8 : 3);
Elem := Elem^.P
Until Elem = Nil
End.
Здесь ссылочная переменная Beg используется для сохранения адреса начала
цепочки. Всякая обработка цепочки начинается с ее первого элемента. В программе
показано, как происходит продвижение по цепочке при ее обработке (в данном примере
при распечатке информационной части списка по порядку).
6. После проверки своей программы предъявите ее преподавателю, выполните
индивидуальное задание и ответьте на контрольные вопросы по теме лабораторной
работы.
6
Лаб 13Л
Download