Добавил:
ikot.chulakov@gmail.com Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабы по Delphi с готовыми программами / Лабораторная работа №10 Односвязные списки, Поиск, Сортировка.pdf
Скачиваний:
28
Добавлен:
12.07.2020
Размер:
260.42 Кб
Скачать

Лабораторные работы по информатике для специальности «Моделирование и исследование операций в организационно-технических системах»

Примеры программ использующих односвязные списки

В данном разделе приведены некоторые примеры использования односвязных списков. Для работы всех примеров необходимо подключить к проекту модуль 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; //список