type stud=record
info:integer;
adr:uk;
del: boolean;
end;
Procedure DEL_SOSED;
begin
{ Я не делал проверку на кол-во элементов в списке, так что если }
{ их менее 2-х, то поведение программы не предсказуемо }
{ Первый проход по списку - помечаем на удаление }
{ Первый элемент проверим отдельно }
first^.del:=false;
p1:=first;
repeat
p1:=p1^.adr;
p1^.del:=false;
until p1^.adr=nil; { Находим конец списка и заодно сбрасываем флаг удаления }
if first^.adr^.info=p1^.info then first^.del:=true;
{ Затем проверяем все остальные }
p1:=First; { Предыдущий }
p2:=First^.adr; { Тот который проверяем }
repeat
if p2^.adr=nil then begin { Это последний элемент }
if p1^.info=first^.info then p2^.del:=true;
end else
if p1^.info=p2^.adr^.info then p2^.del:=true;
p1:=p1^.adr;
p2:=p1^.adr;
until p2=nil;
{ Второй проход - удаляем помеченные элементы }
{ Начнем со второго }
p1:=First; { Предыдущий }
p2:=First^.adr; { Тот который удаляем }
repeat
if p2^.del then begin
p1^.adr:=p2^.adr;
dispose(p2);
end else
p1:=p1^.adr;
p2:=p1^.adr;
until p2=nil;
{ Первый удалим отдельно }
if First^.del then begin
p1:=First^.adr;
dispose(First);
First:=p1;
end;
{ Все }
end;
Procedure DEL_SOSED;
var delfirst: boolean; { Добавил переменную для удаления первого элемента в конце процедуры }
begin
delfirst:=false; {По-умолчанию первый не удаляем}
p3:=first; {Если в этой части заменить p3 например на p1 - то необходимость в p3 вообще отпадает и ее можно удалить}
p:=false;
while p3^.adr<>nil do p3:=p3^.adr;
if first^.adr^.info=p3^.info then
delfirst:=true; {Здесь было удаление первого элемента}
p1:=first^.adr;
p2:=first;
while p1^.adr<>nil do
begin
if (p1^.adr^.info=p2^.info) and not p or (p1^.adr^.info=b) and p then {Свел ваших два if в один, потому как они делали одно и тоже}
begin
p:=true;
b:=p1^.info;
p1:=p1^.adr;
dispose(p2^.adr);
p2^.adr:=p1;
end
else
begin
p:=false;
p2:=p1;
p1:=p1^.adr;
end;
end;
{Исправил условие удаления последнего элемента по аналогии с условием в цикле}
if (p2^.info=first^.info) and not p or (b=first^.info) and p then
begin
p2^.adr:=nil;
dispose(p1);
end;
{Ну и наконец удаляем первый элемент}
if delfirst then begin
p1:=First^.adr;
dispose(First);
First:=p1;
end;
end;
Если Вы уже зарегистрированы на Портале - войдите в систему, если Вы еще не регистрировались - пройдите простую процедуру регистрации.