Лекция: Пример программы
{Определить, входит ли список L1 в список L2}
Program Spisok;
Uses Crt, M_Spis;
{Решение поставленной задачи}
Function Rez(head1,head2:Ref):Boolean;
Var
tec1,
tec2:Ref;
Begin
Rez:=False; {предполагаем, что L1 не входит в L2}
tec2:=head2;
While tec2<>Nil
Do Begin
tec1:=head1;
While (tec2^.inf<>tec1^.inf)And(tec2^.sled<>Nil)
Do tec2:=tec2^.sled;
If tec2^.inf=tec1^.inf
Then Begin
While (tec2^.inf=tec1^.inf)And(tec2<>Nil)And(tec1<>Nil)
Do Begin
tec1:=tec1^.sled;
tec2:=tec2^.sled;
End;
If tec1=Nil
Then Begin
Rez:=True; {L1 входит в L2}
Exit;
End
Else Continue;
End;
tec2:=tec2^.sled;
End;
End;
{Рисование окна на экране}
Procedure Okno(x1,y1,x2,y2,bkcl,cl:Byte;title:String);
Var i:Byte;
Begin
Window(x1,y1,x2,y2);
TextBackGround(bkcl);
TextColor(cl);
ClrScr;
WriteLn(' ',title);
Window(x1,y1+1,x2,y2);
End;
{Основная программа}
Var
head1,
head2:Ref;
Begin
TextBackGround(1);
ClrScr;
Okno(45,1,80,5,12,10,'Исходный список L1:');
Okno(45,6,80,10,12,10,'Исходный список L2:');
Okno(45,12,80,18,13,10,'Результат:');
Okno(1,20,80,25,2,15,'Задача:');
WriteLn(' Определить, входит ли список L1 в список L2.');
Okno(1,1,43,18,14,10,'Ввод:');
WriteLn('Создание списка L1.');
SozdSpis(head1);
Okno(45,1,80,5,12,10,'Исходный список L1:');
Vivod(head1);
Okno(1,1,43,18,14,10,'Ввод:');
WriteLn('Создание списка L2.');
SozdSpis(head2);
Okno(45,6,80,10,12,10,'Исходный список L2:');
Vivod(head2);
If Pust(head1) Or Pust(head2)
Then Begin
Okno(45,12,80,18,13,10,'Результат:');
WriteLn('Один из списков пуст.');
Write('Нажмите <Enter>.');
ReadLn;
Exit;
End;
Okno(45,12,80,18,13,10,'Результат:');
If Rez(head1,head2)
Then WriteLn('Список L1 входит в список L2')
Else WriteLn('Список L1 не входит в список L2');
Write('Для продолжения нажмите Enter->');
ReadLn;
End.
Unit M_Spis;{Модуль работы со списком}
Interface
Type
TElem=Byte;
Ref=^Spis;
Spis=Record
inf:TElem;
sled:Ref;
End;
Procedure InitSpis(Var head,zam:Ref); {инициализации списка}
Function Pust(head:Ref):Boolean; {проверка списка на пустоту}
Procedure VSpisok(Var head,zam:Ref;nov:TElem);{добавление нового
элемента в конец списка}
Procedure SozdSpis(Var head:Ref); {создание списка}
Procedure Vivod(head:Ref); {просмотр списка}
Implementation
{Процедура инициализации списка}
Procedure InitSpis(Var head,zam:Ref);
Begin
head:=Nil;
zam:=Nil;
End;
{Проверка списка на пустоту}
Function Pust(head:Ref):Boolean;
Begin
If head=Nil
Then Pust:=True {список пуст}
Else Pust:=False; {список не пуст}
End;
{Процедура добавления одного элемента в конец списка}
Procedure VSpisok(Var head,zam:Ref;nov:TElem);
Var
tec:Ref;
Begin
New(tec);
tec^.inf:=nov;
tec^.sled:=Nil;
If Pust(head)
Then head:=tec
Else zam^.sled:=tec;
zam:=tec;
End;
{Процедура создания списка}
Procedure SozdSpis(Var head:Ref);
Var
inf:TElem;
zam:Ref;
Begin
InitSpis(head,zam);
WriteLn('Вводите числа одной строкой через пробел.');
WriteLn('Признак конца ввода — ввод 0.');
Read(inf);
While inf<>0
Do Begin
VSpisok(head,zam,inf);
Read(inf);
End;
ReadLn;
End;
{Просмотр списка}
Procedure Vivod(head:Ref);
Var
prom:Ref;
Begin
prom:=head;
While prom<>Nil
Do Begin
Write(prom^.inf,' ');
prom:=prom^.sled;
End;
WriteLn;
WriteLn('Нажмите <Enter>');
ReadLn;
End;
End.