end List
1. На логическом уровне (уровень пользователя) список – это последовательность целых чисел. На физическом уровне (оперативная память) объекты данных типа список целых чисел реализуем, как динамическую информационную структуру односвязный список (Рисунок 1) с дескриптором. Для этой цели будем использовать ссылочные типы, описываемые ниже и средства динамического распределения памяти.
Рисунок 1.Односвязный список с дескриптором из трёх элементов.
2. На уровне языка программирования для описания элементов списка будем использовать следующие типы данных (Пример 1): T, Node, PNode, List, PList.
key: T;
next: PNode;
end;
- тип узлов списка. Узел списка содержит элемент данных в поле key типа T и указатель на следующий узел списка в поле Next типа PNode;
- ссылочный тип, тип указателей (адресов) на узлы списка;
List = record
first: PNode;//указатель на первый элемент списка
last : PNode;//указатель на последний элемент списка
size : integer;//число элементов в списке
end;
- ссылочный тип список. Переменная типа PList содержит указатель на дескриптор списка или значение nil, если список не определён.
Таким образом, список мы реализуем как динамическую информационную структуру – список узлов, в которой узлы и дескриптор списка будут динамическими переменными.
3. В качестве типа T для элементов списка (Пример 1) использован тип integer. В этом случае мы получаем список целых чисел.
4. Приведённые выше типы данных, необходимые для реализации списка целых чисел и подпрограммы поместим в отдельный модуль UList. Ниже приводится (Пример 1), в котором даны описания типов, заголовков подпрограмм, реализующих операции на списке целых чисел и вспомогательных подпрограмм, необходимых для реализации операций на списке.
Пример 1. Реализация списка односвязного списка с дескриптором .
unit UList;
interface
uses SysUtils;
type
//---------------------Исключительные ситуации----------------------------------
EListEmpty = class(Exception)
end;
//---------------------Тип элементов списка-------------------------------------
T = integer;
//---------------------Узел списка----------------------------------------------
PNode = ^Node;
Node = record
key : T;
next : PNode;
end;
// --------------------Дескриптор списка----------------------------------------
PList = ^List;
List = record
first: PNode;//указатель на первый элемент списка
last : PNode;//указатель на последний элемент списка
size : integer;//число элементов в списке
end;
// --Операции на списке---------------------------------------------------------
// --------------------Создать пустой список------------------------------------
function CreateL: PList;
// --------------------Число элементов списка-----------------------------------
function Size(L: PList): integer;
// --------------------Список пуст----------------------------------------------
function IsEmpty(L: PList): Boolean;
// --------------------Взять голову списка (слева)------------------------------
function Head(L: PList): T;
// --------------------Взять голову списка (справа)-----------------------------
function Head_(L: PList): T;
// --------------------Выделить хвост списка (слева)----------------------------
function Tail(var L: PList): PList;
// --------------------Выделить хвост списка (справа)---------------------------
function Tail_(var L: PList): PList;
// --------------------Добавить элемент к списку (справа)-----------------------
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.