Удалить подряд идущие элементы в списке - 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;

Объяснение кода листинга программы

В данном коде реализована процедура удаления дублирующихся элементов из связанного списка.

  1. Передается указатель на голову списка в качестве входного параметра.
  2. В начале процедуры проверяется, что список не пустой.
  3. Затем выполняется цикл, который будет проходить по всем элементам списка, пока не будет достигнуто последнее ребро.
  4. Внутри цикла проверяется, является ли текущий элемент дубликатом следующего элемента. Если это не так, то управление возвращается в начало цикла.
  5. Если текущий элемент является дубликатом следующего элемента, то переменная t инициализируется как next текущего элемента.
  6. Значение next текущего элемента обновляется на значение next следующего элемента.
  7. Затем переменная t освобождается динамической памятью с помощью функции Dispose.
  8. Цикл продолжается до тех пор, пока все элементы списка не будут проверены.
  9. По завершении процедуры возвращается управление.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 3.625 из 5
Похожие ответы