Описать и реализовать класс «Список» целочисленных элементов. Реализовать метод записи отрицательных нечетных элементов списка в один список, положительных четных – в другой и продемонстрировать его работу.
// Лабораторная работа 3.
// Создание класса – списка.
// Выполнил Сергеев Андрей, группа 999.
// Модуль описания и реализации списка. Имя файла ListClass.pas.
unit ListClass;
Interface
Type
tValue=Integer; // тип содержательной части элемента списка – целый
pItem=^tItem; // тип указателя на элемент списка
tItem= record // тип элемента списка
Value: tValue; // содержательная часть элемента списка
Next: pItem; // указатель на следующий элемент списка
end; // record tItem
tList= class (tObject) // класс - «Список»
Private
fHead:pItem; // поле - указатель на начало списка
fSize:Word; // поле – число элементов списка
Public
property Head:pItem read fHead write fHead;
property Size:Word read fSize;
constructor Create; // конструктор – создание пустого списка
destructor Destroy; override; // деструктор – удаление списка
procedure InsertFirst(v:tValue); // включение элемента со знач. v в начало списка
procedure InsertLast(v: tValue); // включение элемента со знач. v в конец списка
procedure WriteList(var f:Text); // вывод значений элементов списка в файл f
procedure Clear; // удаление элементов из списка
procedure FormLists(var L1, L2: tList); // формирование новых списков L1, L2
end;
Implementation
constructor tList.Create;
// Создание пустого списка
Begin
inherited Create;
fHead:= nil; fSize:=0;
end; //constructor tList.Create
destructor tList.Destroy;
// Удаление списка
Begin
Clear; // удаление элементов из списка
inherited Destroy;
end; // destructor tList. Destroy
procedure tList.InsertFirst(v:tValue);
// Включение элемента со значением v в начало списка
var NewItem: pItem; // указатель на новый элемент списка
Begin
New(NewItem); // выделение памяти под новый элемент списка
NewItem^.Value:=v; // запись значения v в поле Value нового элемента
NewItem^.Next:=fHead; // новый элемент ссылается на первый
fHead:=NewItem; // новый элемент становится первым
Inc(fSize); // увеличиваем число элементов списка на 1
end; //procedure tList.InsertFirst
procedure tList.InsertLast(v: tValue);
// Включение элемента со значением v в конец списка
var NewItem, LastItem:pItem; // указатели на новый и последний элементы
Begin
New(NewItem); // выделение памяти под новый элемент списка
NewItem^.Value:=v; // запись значения v в поле Value нового элемента
NewItem^.Next:= nil; // новый элемент становится последним в списке
if fHead= nil // если список пуст,
then fHead:=NewItem // то новый элемент становится первым в списке
else begin // список не пуст – поиск последнего элемента:
LastItem:=fHead; // устанавливаем LastItem на начало списка,
while LastItem^.Next<> nil do begin // пока не достигнут конец списка,
LastItem:=LastItem^.Next; // сдвигаем LastItem на следующий элемент
end;
LastItem^.Next:=NewItem; // новый элемент следует за последним
end;
Inc(fSize); // увеличиваем число элементов списка на 1
end; // procedure tList.InsertLast
procedure tList.WriteList(var f: Text);
// Вывод элементов списка в файл f
var Item:pItem; // указатель на элемент списка
Begin
Item:=fHead; // устанавливаем Item на начало списка
while Item<> nil do begin // пока не достигнут конец списка:
Write(f, Item^.Value:5); Item:=Item^.Next; // вывод элемента и сдвиг Item
end;
Writeln(f);
end; // procedure tList.WriteList
procedure tList.Clear;
// Удаление всех элементов из списка
var Item: pItem; // указатель на удаляемый элемент списка
Begin
while fHead<> nil do begin // пока список не пуст:
Item:=fHead; // устанавливаем Item на начало списка,
fHead:=fHead^.Next; // передвигаем начало списка на следующий элемент
Dispose(Item); // и удаляем элемент
end; // while
fSize:=0; // в списке нет элементов
end; //procedure tList.Clear
procedure tList.FormLists(var L1, L2: tList);
// Формирование списков L1 и L2:
// отрицательные нечетные – в L1, положительные четные – в L2
var Item: pItem; // указатель на текущий элемент списка
Begin
Item:=fHead; // устанавливаем Item на начало списка
while Item<> nil do begin // пока не достигнут конец списка
if (Item^.Value<0) and odd(Item^.Value) then L1.InsertLast(Item^.Value);
if (Item^.Value>0) and not odd(Item^.Value) then L2.InsertLast(Item^.Value);
Item:=Item^.Next; // сдвигаем Item на следующий элемент
end; // while
end; // procedure tList.FormLists
end. // unit ListClass
// Лабораторная работа 3.
// Создание класса – списка. Выполнил Сергеев Андрей, группа 999.
// Формирование двух списков из исходного списка.
// Описание и реализация класса «Список» расположены в модуле ListClass.pas.
// Исходные данные - элементы основного списка - в файле LW3Dat.txt.
// Результаты работы помещаются в файл LW3Res.txt.
program LW3;
{$APPTYPE CONSOLE}
uses ListClass;
Var
fDat, fRes:Text; // файловые переменные для файлов с исх. данными и результ.
L, L1, L2:tList; // объекты - указатели на исходный и результирующие списки
v:tValue; // значение элемента списка
Begin
Assign(fDat,'LW3Dat.txt'); Reset(fDat); // открытие файла для чтения
Assign(fRes,'LW3Res.txt'); Rewrite(fRes); // открытие файла для записи
// Создание экземпляров списков
L:=tList.Create; L1:=tList.Create; L2:=tList.Create;
while not Eof(fDat) do begin // пока не достигнут конец файла fDat
Read(fDat, v); // чтение из файла очередного значения
L.InsertFirst(v); // вставка элемента со значением v в начало списка L
end; // while not Eof(fDat) do
// Вывод в файл fRes элементов списка L и его размера:
Writeln(fRes,'Исходный список:'); L.WriteList(fRes);
Writeln(fRes,'Число элементов списка: ',L.Size);
//Формирование и вывод в файл fRes списков L1 и L2
L.FormLists(L1, L2);
Writeln(fRes, 'Список отрицательных нечетных элементов:');
L1.WriteList(fRes);
Writeln(fRes,'Число элементов списка: ',L1.Size);
Writeln(fRes, 'Список положительных четных элементов:');
L2.WriteList(fRes);
Writeln(fRes,'Число элементов списка: ',L2.Size);
L.Free; L1.Free; L2.Free; // удаление списков
Close(fDat); Close(fRes);
end.
Библиографический список
1. Ахо А.В., Хопкрофт Д.У., Ульман Д.Д. Структуры данных и алгоритмы. М.: Издательский дом «Вильямс», 2001.
2. Вирт Н. Алгоритмы и структуры данных. М.: Мир, 1989.
3. Данные в языках программирования: Абстракция и типология / Пер. с англ. М.: Мир, 1982.
4. Хомоненко А.Д. и др. Delphi 7. СПб.: БХВ-Петербург, 2003.
5. Фаронов В.В. Delphi 3. Учебный курс. М.: «Нолидж», 2001.