
- •Введение
- •Динамические структуры данных
- •Односвязные списки
- •Узлы связного списка
- •Создание односвязного списка
- •Вставка и удаление элементов в односвязном списке
- •Прохождение односвязного списка
- •Поиск предшествующего узла в односвязном списке
- •Вставка перед заданным узлом
- •Сортировка вставками
- •Примеры программ использующих односвязные списки
- •Демонстрационная программа для модуля Lists
- •Загрузка в список текстового файла
- •Задания к лабораторной работе
- •Вопросы к лабораторной работе
- •Справочные таблицы
- •Приложение А – Модуль Lists

Лабораторные работы по информатике для специальности «Моделирование и исследование операций в организационно-технических системах»
Примеры программ использующих односвязные списки
В данном разделе приведены некоторые примеры использования односвязных списков. Для работы всех примеров необходимо подключить к проекту модуль Lists. В модуле Lists собраны подпрограммы для работы с односвязными списками.
Демонстрационная программа для модуля Lists
В ниже приведенной программе приведен пример использования некоторых подпрограмм из модуля Lists.
Листинг 1 – Демонстрационная программа
program SList;
{$APPTYPE CONSOLE}
uses SysUtils,
Lists in 'Lists.pas';
var pInt:^integer; Head:PNode=nil; //список
CurNode, Node:PNode; //текущий узел i, elm:integer;
SNode:PNode;
//вспомогательные подпрограммы
//печать данных узла на экран procedure NodePrint(P:Pointer);
begin
if p<>nil then write(Integer(P^), ' '); end;
//удаление целочисленных динамических переменных procedure DestroyData(P:Pointer);
begin
if p<>nil then dispose(p); end;
//сравнение двух целых чисел
function CompareProc(P1, P2:Pointer):ShortInt; begin
if Integer(P1^)>Integer(P2^) then Result:=1 else
if Integer(P1^)<Integer(P2^) then Result:=-1 else Result:=0;
end;
//условие отбора элементов списка
function CompareProc2(P1, P2:Pointer):ShortInt; begin
if Integer(P1^)>Integer(P2^) then Result:=0 else result:=-1;
end;
//сравнение элемента списка с заданным элементом function SearchProc(P1, P2:Pointer):ShortInt;
begin

Лабораторные работы по информатике для специальности «Моделирование и исследование операций в организационно-технических системах»
if Integer(P1^)=Integer(P2^) then Result:=0 else result:=-1;
end;
//основная программа begin
writeln('Demo single link list'); //создаем список содержащий 20 узлов //каждый узел содержит целое число randomize;
for i:=1 to 20 do begin
new(pInt);//динамическая переменная типа integer //присваиваем динамической переменной значение pInt^:=random(100); Node:=NewNode(pInt);//создаем новый узел
//вставляем узел в список
if Head=nil then CurNode:=InsertBefore(Head, Node) else CurNode:=InsertBefore(CurNode, Node)
end;
//вывод содержимого списка на экран writeln('Source List'); ProcessList(Head, NodePrint); writeln;
//поиск элемента в списке write('Input element to Search: '); readln(elm);
if SearchNode(Head, @elm, SearchProc)<>nil then writeln('Element [', elm, '] found')
else
writeln('Element [', elm, '] not found');
//удаление элемента из списка write('Input element to delete: '); readln(elm);
SNode:=SearchNode(Head, @elm, SearchProc); if SNode<>nil then
begin
writeln('Node [', elm, '] deleted'); DeleteNode(Head, SNode); ProcessList(Head, NodePrint); writeln;
end else
writeln('Element [', elm, '] not found');
//вывод списка узлов значение которых больше заданной величины write('Input value: ');
readln(elm);
SNode:=SearchNodes(Head, @elm, CompareProc2); if SNode<>nil then
begin
writeln('Search result'); ProcessList(SNode, NodePrint);

Лабораторные работы по информатике для специальности «Моделирование и исследование операций в организационно-технических системах»
writeln;
{уничтожение списка с результатами поиска, данные содержащиеся в списке не уничтожаются} DestroyList(SNode, nil);
end else
writeln('Elements not found');
//поиск максимального и минимального значений элементов writeln('Min Value ', Integer(SearchMin(Head,
CompareProc)^.data^));
writeln('Max Value ', Integer(SearchMax(Head, CompareProc)^.data^));
//сортировка списка writeln('Sort List'); InsertionSort(Head, CompareProc); ProcessList(Head, NodePrint); writeln;
//уничтожение списка
DestroyList(Head, DestroyData); writeln('Press Enter to exit'); readln;
end.
Загрузка в список текстового файла
Следующая программа загружает в список содержимое текстового файла.
Листинг 2 – Программа для загрузки текстового файла
program TextList;
{$APPTYPE CONSOLE}
uses SysUtils,
Lists in 'Lists.pas';
//вспомогательные подпрограммы
//печать данных узла на экран procedure NodePrint(P:Pointer);
begin
if p<>nil then writeln(ShortString(P^)); end;
//удаление целочисленных динамических переменных procedure DestroyData(P:Pointer);
begin
if p<>nil then FreeMem(P); end;
//основная программа var F:TextFile;
pStr:pointer;
Buf:string[255]; Head:PNode=nil; //список