- •Тема 1. Стеки, очереди, деки 7
- •Тема 2. Односвязные и двусвязные линейные списки 21
- •Тема 3. Бинарные деревья 40
- •Тема 4. Графы 65
- •Введение
- •Терминология
- •Классификация структур данных по различным признакам
- •Типовые операции над структурами данных
- •Эффективность алгоритмов. O-обозначения
- •Тема 1. Стеки, очереди, деки
- •Операции над стеком
- •Реализация стека
- •Реализация основных операций над стеком
- •Использование стека для преобразования форм записи выражений.
- •Очередь
- •Операции над очередью
- •Операции над деком
- •Реализация очереди и дека
- •Реализация основных операций над очередью и деком
- •Итератор
- •Лабораторная работа 1. Стеки, очереди, деки
- •Тема 2. Односвязные и двусвязные линейные списки
- •Линейный список
- •Операции над линейным списком
- •Реализация линейного списка в виде односвязной динамической структуры
- •Реализация основных операций над односвязным списком
- •Циклический список
- •Операции над циклическим списком
- •Односвязная реализация циклического списка
- •Реализация основных операций над односвязным циклическим списком
- •Реализация линейного списка в виде двусвязной динамической структуры
- •Реализация основных операций над двусвязным списком
- •Циклический двусвязный список
- •Реализация основных операций над двусвязным циклическим списком
- •Лабораторная работа 2. Односвязные и двусвязные линейные списки
- •Тема 3. Бинарные деревья
- •Основные понятия и определения
- •Построение бинарного дерева
- •Операции над бинарным деревом
- •Реализация бинарного дерева
- •Реализация основных операций над бинарным деревом
- •Дерево выражения
- •Дерево поиска
- •Операции над деревом поиска
- •Реализация дерева поиска
- •Реализация операций над деревом поиска
- •Сбалансированные деревья
- •Включение в сбалансированное дерево
- •Лабораторная работа 3. Бинарные деревья
- •Тема 4. Графы
- •Основные понятия и определения
- •Граф g7
- •Операции над графом
- •Реализация графа
- •Реализация основных операций над ориентированным графом
- •Обход ориентированного графа
- •Вычисление расстояния между узлами ориентированного графа
- •Лабораторная работа 4. Ориентированные графы
- •Библиографический список
Лабораторная работа 2. Односвязные и двусвязные линейные списки
Задание
Опишите классы-списки, необходимые для решения задачи, указанной в вашем варианте задания, и реализуйте его методы.
Составьте программу решения задачи с использованием динамических структур данных, реализованных в виде классов.
Варианты заданий
-
Описать односвязный линейный список, каждый элемент которого представляет собой запись, состоящую из двух полей: символ и количество его повторений в тексте. Для создания списка использовать метод вставки в список в отсортированном порядке. Переписать в односвязный циклический список элементы с числом повторений 1.
-
Сложение длинных чисел. Используя двусвязные циклические списки сложить два числа: x = 134557952499317879 и y = 79349864365110. Числа разбить на группы по девять цифр, которые будут являться элементами списка. Результат сложения занести в циклический список.
-
Задача Джозефуса. По кругу стоит группа людей. С терминала вводятся число n и фамилия человека, с которого начинается счет. Начиная с введенной фамилии по кругу отсчитывается n человек, n-й выбывает из круга и т.д. Выводить фамилии исключенных из круга людей. Задачу решить, используя односвязный циклический список.
-
Создать два односвязных циклических списка с целочисленными элементами. Переписать в односвязный линейный список элементы с совпадающими значениями.
-
Описать односвязный циклический список строк. Реализовать метод вставки, который выполняет вставку отсутствующего в списке символа в его конец и перемещение в начало элемента с присутствующим в списке значением. Продемонстрировать работу метода.
-
Проверить правильность расстановки скобок в арифметическом выражении. Для слежения за скобками воспользоваться односвязным циклическим списком. Допустимы четыре вида скобок: круглые, квадратные, фигурные и угловые.
-
Описать двусвязный линейный список строк. Реализовать метод вставки, который выполняет вставку отсутствующего в списке символа в его конец и перемещение на один элемент к началу списка элемента с присутствующим в списке значением. Продемонстрировать работу метода.
-
Из односвязного списка с фамилиями студентов двух групп сформировать два циклических по группам, причем фамилии в циклических списках должны быть упорядочены.
-
С использованием односвязного циклического списка определить правильность вложения циклов в программе на языке Бейсик, состоящей из произвольного количества последовательно расположенных или вложенных инструкций:
10 FOR x=a TO b STEP c
…
30 NEXT c
где x – переменная цикла. Для каждого цикла выводить сообщение вида: «Цикл по x открыт», «Цикл по x закрыт».
-
Создать односвязные списки студентов двух групп с полученными на экзаменах оценками. Сформировать в алфавитном порядке односвязный циклический список студентов, получивших отличные оценки.
-
Сформировать двусвязный список строк. Исключить из списка последние три элемента. Скопировать в двусвязный циклический список вторую половину его элементов, начиная с конца.
-
Выполнить задание 9 при условии, что один оператор NEXT, содержащий несколько переменных, может завершать одновременно несколько вложенных циклов (например: NEXT x,y,z).
-
Сформировать два двусвязных циклических списка с элементами – фамилиями клиентов. Удалить из первого списка клиентов, находящихся в двух списках.
-
Сформировать циклический список целых чисел. Скопировать элементы исходного списка в линейный список таким образом, чтобы они были расположены в нем в порядке, обратном к исходному.
-
Описать односвязный циклический список, тип значения элемента которого – запись из двух полей: символ и количество его повторений в тексте. Переписать в линейный список элементы с русскими буквами.
-
Сформировать два списка с фамилиями клиентов. Слить оба списка в третий, циклический, расположив клиентов через одного.
-
Сформировать двусвязный список, каждым элементом которого являются сведения о студенте (фамилия, номер группы, год рождения). Переписать в двусвязный циклический список студентов заданной группы в порядке, обратном их расположению в исходном списке.
-
Сформировать два циклических списка целых чисел. Слить их в один список, а затем оставить в нем только отличающиеся элементы.
-
Описать односвязный циклический список, тип значения элемента которого – запись из двух полей: символ русского алфавита и количество его повторений в тексте. С использованием односвязного линейного списка расположить элементы исходного списка в обратном порядке.
-
Сформировать два односвязных списка целых чисел. Слить их в односвязный циклический список так, чтобы элементы были расположены по возрастанию значений.
-
В односвязном циклическом списке, каждый элемент которого является совокупностью двух целых значений, заменить нулевыми все элементы с заданной суммой.
-
Создать списки студентов двух групп с фамилиями, расположенными в алфавитном порядке (с использованием метода вставки в отсортированном порядке). Слить их в один циклический список.
-
Решить задачу 3 при счете через одного человека с использованием двусвязного циклического списка.
-
Описать односвязный линейный список, тип значения элемента которого – запись из двух полей: символ и количество его повторений в тексте. Реализовать метод вставки, выполняющий вставку отсутствующего в списке символа в его конец и перемещение на один элемент к началу списка элемента с присутствующим в списке значением.
-
По кругу стоит группа людей. С терминала вводятся число n и фамилия человека, с которого начинается счет. Начиная с введенной фамилии в обратную сторону по кругу отсчитывается N человек, N-й выбывает из круга и т.д. Выводить фамилии исключенных из круга людей. Задачу решить, используя двусвязный циклический список.
-
Сформировать два двусвязных циклических списка с элементами – фамилиями клиентов. Слить эти списки в один, таким образом, чтобы он включал в себя фамилии клиентов поочередно из каждого из исходных списков в обратном порядке.
-
Описать двусвязный список строк и реализовать метод возвращения адреса первого с конца и первого с начала элемента с заданным значением. Исключить второй с начала и второй с конца элемент со значением «дом».
-
С использованием односвязного циклического списка смоделировать работу очереди.
-
Распределить элементы циклического списка по двум линейным спискам следующим образом: в первый список помещаются элементы с начала циклического списка, а во второй – с его конца.
-
Реализовать методы возвращения адреса элемента двусвязного циклического списка по его номеру, начиная от начала и от конца списка. С использованием этого метода поменять местами третий с начала элемент списка с третьим с конца.
Пример выполнения задания
Сформировать односвязный список из вещественных элементов, хранящихся в файле LW2Dat.txt. Исключить из списка элементы с введенным с терминала значением, перенести оставшиеся элементы в односвязный циклический список и вывести значения его элементов в файл результатов.
// Лабораторная работа 2. Линейные односвязные и двусвязные списки.
// Выполнил Сергеев Андрей, группа 500.
// Формирование списка и исключение заданных элементов.
// Исходные данные – элементы списка – в файле LW2Dat.txt
// Результаты работы помещаются в файл LW2Res.txt
program LW2;
uses
SysUtils,
SymplyLists in 'SymplyLists.pas', // модуль односвязных списков
DoublyLists in 'DoublyLists.pas'; // модуль двусвязных списков
function WinDOS(const s:string):string;
// Перекодировка русских символов строки s из ANSI (Windows) в ASCII (DOS)
// Текст подпрограммы приведён в примере выполнения лабор. работы № 1
end; // WinDOS
var
List : tList; // экземпляр линейного списка
CircleList : tCircleList; // экземпляр циклического списка
Item : pItem; // указатель на элемент списка
fDat, fRes : Text; // файлы исходных данных и результатов
LstVal, DelVal : tValue; // значение текущего и исключаемого элементов
quan : Word; // количество элементов сриска
begin
try
Assign(fDat, 'LW1Dat.txt'); Reset(fDat);
Assign(fRes,' LW1Res.txt'); Rewrite(fRes);
WriteLn(fRes, 'Работа со списком - поиск и удаление заданного элемента');
// Создание экземпляров List и CircleList
List := tList.Create; CircleList := tCircleList.Create;
// Формирование линейного списка
while not eof(fDat) do begin
Read(fDat, LstVal);
List.InsertHead(LstVal);
end;
quan:= List.Size;
// Вывод элементов линейного списка в файл результатов методом WriteTo
WriteLn(fRes, 'Сформирован список из ',quan,' элементов:');
List.WriteTo(fRes);
Write(WinDos('Значение исключаемого элемента? '));
ReadLn(DelVal);
WriteLn(fRes, 'Значение исключаемого элемента = ', DelVal:5:1);
// Поиск и исключение из списка элементов со значением DelVal
repeat
Item:= List.Search(DelVal);
if Item<>nil then List.Delete(Item);
until Item=nil;
// Вывод элементов изменённого линейного списка в файл результатов
WriteLn(fRes, 'Из списка исключено ',quan - List.Size,' элементов, осталось ',
List.Size,' элементов:');
List.WriteTo(fRes);
// Перенесение оставшихся элементов в циклический список
while not List.Empty do begin
LstVal:= List.DeleteHead;
CircleList.InsertRear(LstVal);
end;
WriteLn(fRes, 'Элементы линейного списка перенесены в циклический',
' список, состоящий из ', CircleList.Size, ' элементов:');
// Вывод элементов циклического списка в файл результатов
CircleList.WriteTo(fRes);
List.Free; CircleList.Free;
finally
Close(fDat); Close(fRes);
end;
end.