Удалить подряд идущие элементы в списке - 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. - Цикл продолжается до тех пор, пока все элементы списка не будут проверены.
- По завершении процедуры возвращается управление.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д