Смекни!
smekni.com

Структуры и алгоритмы обработки данных (стр. 2 из 4)

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 {если адрес начального элемента указывает на конец списка выводим сообщение}