Удалить подряд идущие элементы в списке - Free Pascal

Узнай цену своей работы

Формулировка задачи:

Пишу программу, создаю односвязный список, вывожу его на экран. Далее нужно удалить подряд-идущие одинаковые элементы все кроме одного, застопорился на процедуре удаления дубликатов. Заранее спасибо.
Листинг программы
  1. Program lab5;
  2. Uses crt;
  3. Type
  4. sllptr = ^slltype;
  5. slltype = record
  6. info: integer;
  7. next : sllptr;
  8. end;
  9. Var
  10. Head, list, r, d: sllptr;
  11. Procedure Creating (var Head, list:sllptr);
  12. var
  13. n,m,i: integer;
  14. begin
  15. ClrScr;
  16. repeat
  17. write('Введите количество элементов списка: ');
  18. readln(n);
  19. Until (n>0);
  20. WriteLn ('Введите ',n,'элементов списка, после каждого элемента нажмите <<ENTER>>');
  21. for i := 1 to n do
  22. begin
  23. read(m);
  24. if head = nil then
  25. begin
  26. new(head);
  27. list:=head;
  28. list^.Next:= nil;
  29. head^.info:= m;
  30. end
  31. else
  32. begin
  33. new(list^.Next);
  34. list:=list^.Next;
  35. list^.Info:= m;
  36. list^.Next:= nil;
  37. end;
  38. end;
  39. list:=head;
  40. end;
  41. Procedure Printone (list: sllptr);
  42. var
  43. p: sllptr;
  44. begin
  45. p:=list;
  46. ClrScr;
  47. WriteLn ('Вы ввели список: ');
  48. While p <> nil do
  49. begin
  50. Write (p^.info:3);
  51. p:=p^.next;
  52. end;
  53. end;
  54. Procedure del_dublicate (list:sllptr; var r,d:sllptr);
  55. var
  56. p: sllptr;
  57. begin
  58. p:=list;
  59. While p <> nil do
  60. begin
  61. r:=p^.next;
  62. While r <> nil do
  63. If (r^.info = p^.info) then
  64. begin
  65. d:=r;
  66. r:=r^.next;
  67. end;
  68. r:=r^.next;
  69. p:=p^.next;
  70. end;
  71. r:=head;
  72. end;
  73. Procedure Printtwo (r: sllptr);
  74. var
  75. p: sllptr;
  76. begin
  77. p:=r;
  78. WriteLn;
  79. WriteLn ('Редактированный список: ');
  80. While p <> nil do
  81. begin
  82. Write (p^.info:3);
  83. p:=p^.next;
  84. end;
  85. end;
  86. begin
  87. Creating (head, list);
  88. Printone (list);
  89. del_dublicate (list, r, d);
  90. Printtwo (r);
  91. ReadLn;
  92. ReadLn;
  93. end.

Решение задачи: «Удалить подряд идущие элементы в списке»

textual
Листинг программы
  1. procedure DelDub(list: sllptr);
  2. var t: sllptr;
  3. begin
  4.   if list<>nil then
  5.     while list^.next<>nil do with list^ do
  6.       if info<>next^.info then list:=next
  7.       else begin
  8.         t:=next; next:=next^.next; Dispose(t);
  9.       end;
  10. end;

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

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

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

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


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

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

8   голосов , оценка 3.625 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы