- •Динамические переменные
- •Списковые структуры
- •Операции над линейными списками
- •Примеры рекурсивного описания функций для обработки линейных списков
- •Рекурсивное определение функции ForEach будет иметь вид
- •Специальные случаи линейных списков
- •Представления линейных списков
- •Разновидности линейных связанных списков
- •Задание
Задание
Требуется составить программу типа ConsoleApplication обработки двунаправленного связанного списка, удовлетворяющая следующим требованиям:
Программа «должна иметь» модульную структуру: основная программа + три модуля. Первый модуль (например, UStudent) содержит структуры и «методы» работы с записями типа TStudent. Второй модуль (например, UNode) содержит структуры и «методы» работы с записями типа TNode. Третий модуль (например, UList) содержит структуры и «методы» работы с записями типа TList.
Работа программы «должна управляться» с помощью меню.
Список «должен выполнять» не менее семи функций.
Функции сохранения списка в файле и восстановления списка из файла являются обязательными.
Варианты структур данных, находящихся на «нижнем» уровне списка, взять из лабораторной работы № 11 (или лабораторной работы № 13) первого семестра. В рассмотренных выше примерах нижний уровень списка соответствует объявлению типа TSudent.
Приложения
Прототип модуля UStudent
unit UStudent;
interface
type TStudentPtr = ^TStudent; // Это указатель на студента
TStudent = record // Это студент
Name: string[20];
Age: Byte;
Group: string[12];
end;
procedure ReadIn(p: TStudentPtr);// Прочитать студента с консоли
procedure PrintOn(p: TStudentPtr);// Напечатать студента на консоли
implementation
…
end.
Прототип модуля UNode
unit UNode;
interface
uses UStudent;
type TNodePtr = ^TNode; // Это указатель на узел списка
TNode = record // Это узел двунаправленного списка
Down: TStudentPtr;
Next: TNodePtr;
Prev: TNodePtr;
end;
procedure Init(prev, next, curr: TNodePtr; down: TStudentPtr);// Инициализировать узел
procedure Done(p: TNodePtr);// Разрушить узел
implementation
…
end.
Прототип модуля UList
unit UList;
interface
uses UStudent, UNode;
type TListPtr = ^TList; // Это указатель на заголовок списка
TList = record // Это заголовок списка
First: TNodePtr;
Last: TNodePtr;
Count: Integer;
end;
procedure Create(var p: TListPtr);// Создает пустой список
procedure AddFirst(p: TListPtr; d: TStudentPtr);// Добавляет новый узел в начало списка
procedure AddLast(p: TListPtr; d: TStudentPtr);// Добавляет новый узел в конец списка
procedure RemoveFirst(p: TListPtr);// Удаляет узел в начале списка
procedure RemoveLast(p: TListPtr);// Удаляет узел в конце списка
procedure FindFirst(p: TListPtr);// Находит первый узел, содержащий значение по умолчанию.
procedure FindLast(p: TListPtr);// Находит последний узел, содержащий значение по умолчанию.
procedure Print(p: TListPtr);// Распечатывает список на консоли
procedure Build(p: TListPtr);// Строит список из произвольного числа узлов
procedure Clear(p: TListPtr);// Удаляет все узлы из списка
procedure Insert(p: TListPtr; n: Integer);// Добавляет узел в список в позиции с указанным индексом.
procedure RemoveAt(p: TListPtr; n: Integer);// Удаляет узел списка с указанным индексом
procedure Save(p: TListPtr; f: string); // Сохраняет список в файле
procedure Load(p: TListPtr; f: string); // Загружает список из файла
procedure Sort(p: TListPtr);// Сортирует элементы списка с помощью компаратора по умолчанию
implementation
…
end.