ЛР1. Обработка списков

Задание

Используя лекционный материал, разработать модуль управления односвязными списками, основанный на структурах TList и TNode:

type
	PNode=^TNode;
	TNode=record
		data:integer;
		pnext:PNode;
	end;	

	PList=^TList;
	TList=record
		PHead:PNode;
		PLast:PNode;
		Count:integer;
	end;
Реализовать следующие функции, проверить их работоспособность:
  1. Создание, уничтожение, вывод
    function createList():PList; // создание списка
    function createNode(key:integer):PNode; // создание узла
    
    procedure clearList(PL:PList); // уничтожение содержимого списка
    function disposeList(var PL:PList); // полное уничтожение списка
    
    procedure showList(PL:PList); // показ списка
    procedure showListRev(PL:PList); // показ списка в обратном порядке
    
  2. Добавление, удаление
    function addFirstNode(PL:PList; P:PNode):PNode; // добавление в начало списка
    function addLastNode(PL:PList; P:PNode):PNode; // добавление в конец списка
    function insertNode(PL:PList; PPrev:PNode; P:PNode):PNode; // вставка в список
    
    function deleteNode(PL:PList; key:integer):PNode; // удаление узла в списке с предварительным поиском
    function deleteNode(PL:PList; P:PNode):PNode; // удаление переданного узла в списке
    function deleteNodeAfter(PL:PList; PPrev:PNode):PNode; // удаление узла в списке после переданного узла
    
  3. Поиск, вырезка, сортировки.
    function findNode(PL:PList; key:integer):PNode; // поиск узла в списке
    
    // Добавляет к списку PLTo вырезку из списка PLFrom, начиная с элемента с номером first
    // в количестве len элементов.
    procedure subList(PLFrom,PLTo:PList; first:integer; len:integer):PList;
    
    // Сортировки списка. Разрешается изменять содержимое элементов списка, сохраняя их позиции.
    procedure sortList(PL:PList); // сортирует список по возрастанию
    procedure sortListRev(PL:PList); // сортирует список по убыванию