Удалить подряд идущие элементы в списке - Free Pascal
Формулировка задачи:
Пишу программу, создаю односвязный список, вывожу его на экран. Далее нужно удалить подряд-идущие одинаковые элементы все кроме одного, застопорился на процедуре удаления дубликатов. Заранее спасибо.
Program lab5;
Uses crt;
Type
sllptr = ^slltype;
slltype = record
info: integer;
next : sllptr;
end;
Var
Head, list, r, d: sllptr;
Procedure Creating (var Head, list:sllptr);
var
n,m,i: integer;
begin
ClrScr;
repeat
write('Введите количество элементов списка: ');
readln(n);
Until (n>0);
WriteLn ('Введите ',n,'элементов списка, после каждого элемента нажмите <<ENTER>>');
for i := 1 to n do
begin
read(m);
if head = nil then
begin
new(head);
list:=head;
list^.Next:= nil;
head^.info:= m;
end
else
begin
new(list^.Next);
list:=list^.Next;
list^.Info:= m;
list^.Next:= nil;
end;
end;
list:=head;
end;
Procedure Printone (list: sllptr);
var
p: sllptr;
begin
p:=list;
ClrScr;
WriteLn ('Вы ввели список: ');
While p <> nil do
begin
Write (p^.info:3);
p:=p^.next;
end;
end;
Procedure del_dublicate (list:sllptr; var r,d:sllptr);
var
p: sllptr;
begin
p:=list;
While p <> nil do
begin
r:=p^.next;
While r <> nil do
If (r^.info = p^.info) then
begin
d:=r;
r:=r^.next;
end;
r:=r^.next;
p:=p^.next;
end;
r:=head;
end;
Procedure Printtwo (r: sllptr);
var
p: sllptr;
begin
p:=r;
WriteLn;
WriteLn ('Редактированный список: ');
While p <> nil do
begin
Write (p^.info:3);
p:=p^.next;
end;
end;
begin
Creating (head, list);
Printone (list);
del_dublicate (list, r, d);
Printtwo (r);
ReadLn;
ReadLn;
end.Решение задачи: «Удалить подряд идущие элементы в списке»
textual
Листинг программы
procedure DelDub(list: sllptr); var t: sllptr; begin if list<>nil then while list^.next<>nil do with list^ do if info<>next^.info then list:=next else begin t:=next; next:=next^.next; Dispose(t); end; end;
Объяснение кода листинга программы
В данном коде реализована процедура удаления дублирующихся элементов из связанного списка.
- Передается указатель на голову списка в качестве входного параметра.
- В начале процедуры проверяется, что список не пустой.
- Затем выполняется цикл, который будет проходить по всем элементам списка, пока не будет достигнуто последнее ребро.
- Внутри цикла проверяется, является ли текущий элемент дубликатом следующего элемента. Если это не так, то управление возвращается в начало цикла.
- Если текущий элемент является дубликатом следующего элемента, то переменная
tинициализируется какnextтекущего элемента. - Значение
nextтекущего элемента обновляется на значениеnextследующего элемента. - Затем переменная
tосвобождается динамической памятью с помощью функции Dispose. - Цикл продолжается до тех пор, пока все элементы списка не будут проверены.
- По завершении процедуры возвращается управление.