begin
Write(rus('Вы ввели не число или число превышающее диапазон '));
WriteLn(rus('типа Integer (-32768..32767) '));
WriteLn('');
WriteLn(rus('Введите другое число'));
Proverka(w); {выполняем рекурсивный вход в
процедуру}
end;
end;
End;
Procedure Gou(w: WE); forward; //Опережающееописаниепроцедуры
Procedure Create2(var sag: PE); {Процедура ввода элементов в ЛОС с сортировкой по возрастанию}
Var
q, qq, s: PE; //адресные переменные
a: TE; //переменная для ввода данных
Begin
writeln(' ');
WriteLn(rus('Введите элементы в ЛОС: '));
WriteLn(rus('Ввод завершите 0'));
ifst2<>1 then //если ЛОС еще не был создан
begin
New(sag); //создаем указатель начала списка
q:=sag^.next; //запоминаем адрес первого элемента ЛОС
end;
Ifst = 1 then {если пользователь выбрал вариант работы, с типом Integer}
//st = 1 – работа с типом данных, Integer
begin
Proverka(w); {вход в процедуру проверки корректности
ввода данных}
a:= StrToInt(w); {перевод числа из строкового типа данных в целочисленный}
end
else {если пользователь выбрал вариант работы, работа с типом String}
//st = 2 – работа с типом данных, String
ReadLn(stroka); //вводданныхтипа String
if(q= nil) or (st2=1) then {если ЛОС был пустым или ЛОС уже создавался}
Begin
New(q); {создаем адресную переменную для
первого элемента}
Ifst = 1 then {если пользователь выбрал вариант работы, работа с типом Integer}
//st = 1 – работа с типом данных, Integer
q^.inf:= a {заносим в информационную часть, значение данных}
else
q^.inf2:= stroka; {заносим в информационную часть, значение данных}
q^.next:= sag^.next; {в адресную часть второго элемента
заносим адресную часть первого
элемента}
sag^.next:= q; {в адресную часть первого элемента заносим адрес созданного указателя}
Ifst = 1 then {если пользователь выбрал вариант работы, работа с типом Integer}
//st = 1 – работа с типом данных, Integer
begin
Proverka(w); {вход в процедуру проверки корректности ввода данных}
a:= StrToInt(w); {перевод числа из строкового типа данных в целочисленный}
end
else
ReadLn(stroka); //вводданныхтипа String
End;
Ifst = 1 then {если пользователь выбрал вариант работы, работа с типом Integer}
//st = 1 – работа с типом данных, Integer
begin
Whilea<>0 do {запускаем цикл выполняющийся пока не будет введен ноль}
Begin
New(q); {создаем адресную переменную для первого элемента}
q^.inf:= a; {заносим в информационную часть, значение данных}
q^.next:= sag^.next; {в адресную часть второго элемента заносим адресную часть первого элемента}
sag^.next:= q; {в адресную часть первого элемента заносим адрес созданного указателя}
//---------сортировка
qq:= sag^.next; //запоминаем адрес первого элемента ЛОС
Whileqq<>Nildo {запускаем цикл выполняющийся пока не будет достигнут конец списка}
begin
s:= qq; //запоминаем адрес первого элемента ЛОС
qq:= qq^.next; {запоминаем адрес следующего элемента
ЛОС}
if (qq<>nil) then {если адресная переменная не равна указателю конца списка}
begin
begin
if (qq^.inf<s^.inf) then {если информационная часть следующего элемента меньше чем предыдущего, тогда:}
begin
a:= qq^.inf; {запоминаем значение информационной части следующего элемента}
qq^.inf:=s^.inf; {в информационную часть следующего элемента запоминаем значение информационной части
предыдущего элемента}
s^.inf:= a; {в информационную часть предыдущего элемента запоминаем значение следующего элемента}
end;
end;
end;
end; //---------конецсортировки
Proverka(w); {вход в процедуру проверки корректности ввода данных}
a:= StrToInt(w); {перевод числа из строкового типа данных в целочисленный}
end;
end
else
begin
Whilestroka<>'0' do {запускаем цикл выполняющийся пока не будет введен ноль}
Begin
New(q); {создаем адресную переменную для первого элемента}
q^.inf2:= stroka; {заносим в информационную часть, значение данных}
q^.next:= sag^.next; {в адресную часть второго элемента
заносим адресную часть первого
элемента}
sag^.next:= q; {в адресную часть первого элемента заносим адрес созданного указателя}
//---------сортировка
qq:= sag^.next; //запоминаем адрес первого элемента ЛОС
Whileqq<>Nildo {запускаем цикл выполняющийся пока не будет достигнут конец списка}
begin
s:= qq; //запоминаем адрес первого элемента ЛОС
qq:= qq^.next; {запоминаем адрес следующего элемента
ЛОС}
if (qq<>nil) then {если адрес переменной не равен указателю конца списка}
begin
begin
if (qq^.inf2<s^.inf2) then {если информационная часть следующего элемента меньше чем предыдущего, тогда:}
begin
a:= qq^.inf2; {запоминаем значение информационной части следующего элемента}
qq^.inf2:=s^.inf2; {в информационную часть следующего элемента запоминаем значение информационной части
предыдущего элемента}
s^.inf2:= a; {в информационную часть предыдущего элемента запоминаем значение следующего элемента}
end;
end;
end;
end;
//---------конецсортировки
ReadLn(stroka); //вводданныхтипа String
end;
end;
WriteLn('');
WriteLn(rus('ВашитоговыйЛОС:'));
print(sag); //вывод ЛОС на экран
WriteLn(' ');
ifst2=1 then //если ЛОС наполняется первый раз
Gou(w); {процедура перемещения между
процедурами}
End;
Procedure Vopros ( w: WE); {процедура вывода списка вариантов дальнейших вариантов работы в ЛОС}
Begin
WriteLn(rus('___________________________________________'));
WriteLn(rus('Что Вы хотите выполнить дальше?'));
WriteLn('');
WriteLn(rus('2 - Добавить элемент в начало списка'));
Write(rus('3 - Добавить элемент в середину списка, перед указанным ‘));
WriteLn(rus('значением'));
Write(rus('4 - Добавить элемент в середину списка, после указанного ‘));
WriteLn(rus('значения'));
WriteLn(rus('5 - Добавить элемент в конец списка'));
WriteLn(rus(''));
WriteLn(rus('6 - Удалить элемент в начале списка'));
Write(rus('7 - Удалить элемент ЛОС стоящий перед указанным ‘));
WriteLn(rus('значением списка'));
Write(rus('8 - Удалить элемент ЛОС стоящий после указанного “));
WriteLn(rus('значения списка'));
WriteLn(rus('9 - Удалить определенный элемент в списке'));
WriteLn(rus('10 - Удалить элемент в конце списка'));
WriteLn(rus('11 - Удалить первый и последний элементы ЛОС'));
WriteLn('');
WriteLn(rus('12 - ОчиститьЛОС'));
WriteLn('');
WriteLn(rus('13 - Поиск элемента по его значению'));
WriteLn('');
WriteLn(rus('14 - Сортировка элементов'));
WriteLn('');
Write(rus('15 - Подсчитать количество идентичных по содержанию '));
WriteLn(rus('элементов с указанным'));
WriteLn('');
WriteLn(rus('0 - Выход'));
WriteLn('');
WriteLn(rus('___________________________________________'));
End;
ProcedureGou( w: WE); {процедура перемещения между
процедурами}
Begin
WriteLn(rus('Нажмите Ввод для продолжения'));
ReadLn(W); //ждем нажатия Enter
Whilew<>'' do {проверяем был ли просто нажат Enter или пользователь что-то ввел. цикл будет работать пока пользователь не нажмет просто Enter, без ввода данных}
begin
WriteLn('');
ifw='' then {если был нажат Enter без ввода данных продолжаем работу процедуры}
else {иначе выдаем сообщение}
WriteLn(rus('Будьте внимательны, нужно просто нажать на ввод!'));
ReadLn(W); //ждемнажатия Enter
end;
WriteLn('');
WriteLn('');
Vopros(w); {процедура вывода списка вариантов дальнейших вариантов работы в ЛОС}
WriteLn;
WriteLn('');
proverka(w); {вход в процедуру проверки корректности ввода данных}
oper:=strtoint(w); {перевод числа из строкового типа данных в целочисленный}
Whileoper=1 do {если ЛОС не пустой то выводим
сообщение}
Begin
Write(rus('Ваш ЛОС не пустой, для создания нового '));
Writeln(rus('удалите все элементы текущего.'));
Writeln(rus('Выберите вариант дальнейших действий.'));
proverka(w); {вход в процедуру проверки корректности ввода данных}
oper:= StrToInt(w); {перевод числа из строкового типа данных в целочисленный}
end;
end;
. . .
Procedure Delet11 (var sag: PE); {процедура удаления первого и последнего, элементов в ЛОС}
var
k, kk, q, qq: PE; //адресные переменные
Begin
WriteLn(rus('Ваш ЛОС выглядел так:'));
WriteLn('');
print(sag); //процедура вывода ЛОС
WriteLn('');
q:= sag^.next; //запоминаем адрес первого элемента
k:= sag^.next; //запоминаем адрес первого элемента
Ifq^.next=Nilthen {если адрес второго элемента содержит указывает на конец списка}
Begin
sag^.next:=q^.next; {в адресную часть первого элемента заносим указатель на конец списка}
dispose(k); //удаляем адрес первого элемента
WriteLn(rus('В ЛОС был только один элемент!')); //выводим сообщение
WriteLn(' ');
End
Else //иначе
Begin
qq:=sag^.next; //запоминаем адрес первого элемента
q:=qq^.next; //запоминаем адрес второго элемента
if (q^.next= Nil) then {если адресная часть второго элемента указывает на конец списка (это означает что в ЛОС только два элемента)}
Begin
sag^.next:=Nil; {в адресную часть начала ЛОС заносим указатель на конец списка}
dispose(q); //удаляем адрес первого элемента
dispose(q); //удаляем адрес второго элемента
End
Else //иначе
Begin
q:= sag^.next; //запоминаем адрес второго элемента
sag^.next:=q^.next; {в адресную часть первого элемента заносим адрес второго элемента}
dispose(k); //удаляем адрес первого элемента
q:= sag^.next; //запоминаем адрес первого элемента
qq:=q^.next; //запоминаем адрес второго элемента
While (q<>Nil)do {цикл удаления последнего элемента
проходим по списку, до тех пор, пока указатель не будет равен значению, указателя на конец списка}
Begin
kk:=q; //запоминаем адрес текущего элемента
q:=q^.next; //запоминание следующего адреса
k:= qq; //запоминаем адрес следующего элемента
qq:=qq^.next; //запоминание следующего адреса
ifqq=Nilthen {если адресная часть следующего элемента указывает на значение конца списка значит мы нашли адрес последнего элемента ЛОС}
Begin
kk^.next:= qq; {заносим в адресную часть предыдущего элемента значение конца списка}
q:=kk^.next; {запоминание в переменную указателя, значение конца списка для выхода из цикла}
dispose(k); //удаляем адрес последнего элемента
End;
end;
End;
End;
q:=sag^.next; //запоминаем адрес начального элемента
ifq= Nilthen {если адрес начального элемента указывает на конец списка выводим сообщение}