Линейный (однонаправленный) список является динамической структурой данных, данные в которую могут включаться и изыматься в произвольно выбранное место. Построим модель списка при помощи определенной структуры данных, состоящей из динамических переменных. Каждый элемент списка представим записью языка Pascal, которая состоит из двух полей: информационного поля или поля данных, которое в общем случае может содержать произвольное
(фиксированное для данного типа элемента) количество полей разных типов; ссылки на следующий элемент списка.
Каждую такую пару будем называть звеном, а
ссылки, содержащиеся в каждом из звеньев, будем использовать для соединения
звеньев в цепочку. Такой способ представления упорядоченной последовательности
элементов называется сцеплением. Каждая компонента списка определяется
ключом. Обычно ключ - это либо число, либо строка символов. Ключ располагается
в поле данных компоненты, он может занимать как отдельное поле записи, так и
быть частью информационного поля записи. Рассмотрим схематичное изображение
однонаправленного списка:
Рис.1. Схематичное изображение однонаправленного списка без заглавного звена
Над списками выполняются следующие операции: - начальное формирование списка
(запись первой компоненты);
- добавление компоненты в конец
списка;
- определение первого элемента в
линейном списке;
- чтение компоненты с заданным
ключом; с заданным свойством;
- вставка компоненты в заданное
место списка (обычно до компоненты с заданным ключом или после неё);
- исключение компоненты с
заданным ключом из списка.
- упорядочивание узлов линейного
списка в определенном порядке.
Описание компоненты однонаправленного списка дадим следующим образом: Type TElement = record pole1:string; {поле 1 } pole2:string; {поле 2 } pole3:string; {поле 3 } end; PRec = ^Rec; Rec = Record Element : TElement; {Информационное поле} pNext : PRec; {Ссылка на следующую компоненту} endelement:boolean; {признак последнего элемента} End;
var Fl1:prec;
Function CreateFirstElement(Value:TElement):PRec; {Создаем первый элемент динамической структуры } Procedure AddElement(FirstElement_Value:prec;Value:TElement); {добавление компоненты в конец списка;} Function FillListElement(FirstElement:PRec):TstringList; // Процедура вывода элементов на экран Procedure DeleteElement(Index:integer;var FirstElement:PRec); {Удалить элемент} Function GetElementCount(FirstElement_Value:PRec):integer;{Кол-во элементов в динамической структуре где главный элемент FirstElement_Value } Procedure InsertToElement(var FirstElement:PRec; const index:integer; const Value:Telement); Procedure DeleteALl(var FirstElement:PRec);{Удалить все элементы } Procedure ChangeIndexElement(index1,index2:integer;FirstElement:PRec); Function GetElementValue(Index:integer;FirstElement:PRec):Telement; {Получить элемент номер Index из структуры где главный элемент FirstElement} Function GetMinElementFromMassiv(FirstElement:PRec):integer; Procedure SortElementValue2(FirstElement:PRec); Procedure SortElementValue(FirstElement:PRec); Function GetMaxElementFromMassiv(FirstElement:PRec):integer;
Function CreateFirstElement(Value:TElement):PRec; {Создаем первый элемент динамической структуры } var NewElement:PRec; begin New(NewElement); {выделяем память под дополнительный элемент} NewElement^.Element := value; {заполняем его поле Info} result:=NewElement; end;
Function GetLastElement(FirstElement_Value:PRec):PRec; {получить последний элемент } var i:integer; Cur:PRec; {временная переменная} begin i:=0; Cur:=FirstElement_Value; while Cur<>nil do begin i:=i+1; if Cur.endelement then break; Cur:=Cur^.pNext; end; result:=Cur; end;
// добавление компоненты в конец списка; Procedure AddElement(FirstElement_Value:prec;Value:TElement); var NewElement:PRec; CurrentElemnet:PRec; begin CurrentElemnet:=GetLastElement(FirstElement_Value); if CurrentElemnet=nil then CurrentElemnet:=FirstElement_Value; New(NewElement); {выделяем память под дополнительный элемент} NewElement^.Element := value; {заполняем его поле Info} CurrentElemnet.pNext:=NewElement; {вставляем элемент в список} CurrentElemnet.endelement:=false; CurrentElemnet:= NewElement; CurrentElemnet.endelement:=true;
end;
|