Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
САОД Part 1.DOC
Скачиваний:
41
Добавлен:
02.11.2018
Размер:
1.68 Mб
Скачать

Лабораторная работа 2. Односвязные и двусвязные линейные списки

Задание

Опишите классы-списки, необходимые для решения задачи, указанной в вашем варианте задания, и реализуйте его методы.

Составьте программу решения задачи с использованием динамических структур данных, реализованных в виде классов.

Варианты заданий

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

  2. Сложение длинных чисел. Используя двусвязные циклические списки сложить два числа: x = 134557952499317879 и y = 79349864365110. Числа разбить на группы по девять цифр, которые будут являться элементами списка. Результат сложения занести в циклический список.

  3. Задача Джозефуса. По кругу стоит группа людей. С терминала вводятся число n и фамилия человека, с которого начинается счет. Начиная с введенной фамилии по кругу отсчитывается n человек, n-й выбывает из круга и т.д. Выводить фамилии исключенных из круга людей. Задачу решить, используя односвязный циклический список.

  4. Создать два односвязных циклических списка с целочисленными элементами. Переписать в односвязный линейный список элементы с совпадающими значениями.

  5. Описать односвязный циклический список строк. Реализовать метод вставки, который выполняет вставку отсутствующего в списке символа в его конец и перемещение в начало элемента с присутствующим в списке значением. Продемонстрировать работу метода.

  6. Проверить правильность расстановки скобок в арифметическом выражении. Для слежения за скобками воспользоваться односвязным циклическим списком. Допустимы четыре вида скобок: круглые, квадратные, фигурные и угловые.

  7. Описать двусвязный линейный список строк. Реализовать метод вставки, который выполняет вставку отсутствующего в списке символа в его конец и перемещение на один элемент к началу списка элемента с присутствующим в списке значением. Продемонстрировать работу метода.

  8. Из односвязного списка с фамилиями студентов двух групп сформировать два циклических по группам, причем фамилии в циклических списках должны быть упорядочены.

  9. С использованием односвязного циклического списка определить правильность вложения циклов в программе на языке Бейсик, состоящей из произвольного количества последовательно расположенных или вложенных инструкций:

10 FOR x=a TO b STEP c

30 NEXT c

где x – переменная цикла. Для каждого цикла выводить сообщение вида: «Цикл по x открыт», «Цикл по x закрыт».

  1. Создать односвязные списки студентов двух групп с полученными на экзаменах оценками. Сформировать в алфавитном порядке односвязный циклический список студентов, получивших отличные оценки.

  2. Сформировать двусвязный список строк. Исключить из списка последние три элемента. Скопировать в двусвязный циклический список вторую половину его элементов, начиная с конца.

  3. Выполнить задание 9 при условии, что один оператор NEXT, содержащий несколько переменных, может завершать одновременно несколько вложенных циклов (например: NEXT x,y,z).

  4. Сформировать два двусвязных циклических списка с элементами – фамилиями клиентов. Удалить из первого списка клиентов, находящихся в двух списках.

  5. Сформировать циклический список целых чисел. Скопировать элементы исходного списка в линейный список таким образом, чтобы они были расположены в нем в порядке, обратном к исходному.

  6. Описать односвязный циклический список, тип значения элемента которого – запись из двух полей: символ и количество его повторений в тексте. Переписать в линейный список элементы с русскими буквами.

  7. Сформировать два списка с фамилиями клиентов. Слить оба списка в третий, циклический, расположив клиентов через одного.

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

  9. Сформировать два циклических списка целых чисел. Слить их в один список, а затем оставить в нем только отличающиеся элементы.

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

  11. Сформировать два односвязных списка целых чисел. Слить их в односвязный циклический список так, чтобы элементы были расположены по возрастанию значений.

  12. В односвязном циклическом списке, каждый элемент которого является совокупностью двух целых значений, заменить нулевыми все элементы с заданной суммой.

  13. Создать списки студентов двух групп с фамилиями, расположенными в алфавитном порядке (с использованием метода вставки в отсортированном порядке). Слить их в один циклический список.

  14. Решить задачу 3 при счете через одного человека с использованием двусвязного циклического списка.

  15. Описать односвязный линейный список, тип значения элемента которого – запись из двух полей: символ и количество его повторений в тексте. Реализовать метод вставки, выполняющий вставку отсутствующего в списке символа в его конец и перемещение на один элемент к началу списка элемента с присутствующим в списке значением.

  16. По кругу стоит группа людей. С терминала вводятся число n и фамилия человека, с которого начинается счет. Начиная с введенной фамилии в обратную сторону по кругу отсчитывается N человек, N-й выбывает из круга и т.д. Выводить фамилии исключенных из круга людей. Задачу решить, используя двусвязный циклический список.

  17. Сформировать два двусвязных циклических списка с элементами – фамилиями клиентов. Слить эти списки в один, таким образом, чтобы он включал в себя фамилии клиентов поочередно из каждого из исходных списков в обратном порядке.

  18. Описать двусвязный список строк и реализовать метод возвращения адреса первого с конца и первого с начала элемента с заданным значением. Исключить второй с начала и второй с конца элемент со значением «дом».

  19. С использованием односвязного циклического списка смоделировать работу очереди.

  20. Распределить элементы циклического списка по двум линейным спискам следующим образом: в первый список помещаются элементы с начала циклического списка, а во второй – с его конца.

  21. Реализовать методы возвращения адреса элемента двусвязного циклического списка по его номеру, начиная от начала и от конца списка. С использованием этого метода поменять местами третий с начала элемент списка с третьим с конца.

Пример выполнения задания

Сформировать односвязный список из вещественных элементов, хранящихся в файле 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.