Удалить из списка все элементы, входящие в него в точности 2 раза - Free Pascal

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

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

Дан список из n целых чисел a1,a2,..,an. Удалить из списка все элементы, входящие в него в точности 2 раза.
Листинг программы
  1. program L02;
  2. uses
  3. crt;
  4. type
  5. PList = ^TList;
  6. TList = record
  7. a: integer;
  8. pred, next: PList;
  9. end;
  10. var
  11. head: PList;
  12. n: integer;
  13. {Формирование списка}
  14. procedure FormList(var head: PList; n: byte);
  15. var
  16. p, q: PList;
  17. i: byte;
  18. begin{FormList}
  19. randomize;
  20. new(head); {Сторож - головной элемент}
  21. head^.next := nil;
  22. head^.pred := nil;
  23. p := head;
  24. for I := 1 to n do
  25. begin
  26. new(q);
  27. q^.a := random(10);
  28. q^.pred := p;
  29. q^.next := nil;
  30. p^.next := q;
  31. p := q;
  32. end;
  33. end;{FormList}
  34. {Вывод списка на экран}
  35. procedure PrintList(head: PList);
  36. var
  37. p: PList;
  38. begin{PrintList}
  39. p := head^.next;
  40. while p <> nil do
  41. begin
  42. write(p^.a:6);
  43. p := p^.next;
  44. end;
  45. writeln;
  46. end;{PrintList}
  47. procedure Delete(head: PList);
  48. var
  49. p, q, q2: PList;
  50. c: integer;
  51. begin{Delete}
  52. p := head^.next;
  53. while p <> nil do
  54. begin
  55. c := 0;
  56. // q:=p^.next;
  57. q := head^.next; // начинаем всегда с самого начала списка, а не со следующего за P элемента
  58. while q <> nil do
  59. begin
  60. if p^.a = q^.a then
  61. begin
  62. if p <> q then q2 := q; // тот элемент, куда указывает p, запоминать не надо, мы и так знаем про него
  63. c := c + 1;
  64. end;
  65. q := q^.next;
  66. end;
  67. if c = 2 then // Если их ровно 2, то первый - это тот, куда указывает p, а второй - q2
  68. begin
  69. q := p; // удаляем первый
  70. q^.pred^.next := q^.next;
  71. q^.next^.pred := q^.pred;
  72. p := p^.next;
  73. dispose(q);
  74. q := q2; // и второй, с учетом, что он может оказаться прямо за первым
  75. q^.pred^.next := q^.next;
  76. q^.next^.pred := q^.pred;
  77. if(q = p) then p := p^.next; // тогда продвигаемся дальше
  78. dispose(q);
  79. printlist(head);
  80. end
  81. else p := p^.next;
  82. end;
  83. end;{Delete}
  84. begin
  85. ClrScr;
  86. writeln('-----------------------------------------------------------');
  87. writeln('Программа генерирует случайными значениями линейный список,');
  88. writeln(' затем удаляет из него элементы,которые встречаются ');
  89. writeln('2 раза ');
  90. writeln('-----------------------------------------------------------');
  91. writeln('Введите количество элементов списка');
  92. readln(n);
  93. FormList(head, n);
  94. writeln('Исходный список:');
  95. PrintList(head);
  96. Delete(head);
  97. writeln('Список после удаления элементов,встречающихся 2 раза:');
  98. PrintList(head);
  99. end.
Программа работает, но иногда выдает такую ошибку. Как исправить?

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

textual
Листинг программы
  1.     if c = 2 then // Если их ровно 2, то первый - это тот, куда указывает p, а второй - q2
  2.     begin
  3.       q := p; // удаляем первый
  4.       if (q^.pred <> nil) then q^.pred^.next := q^.next;
  5.       if (q^.next <> nil) then q^.next^.pred := q^.pred;
  6.       p := p^.next;
  7.       dispose(q);
  8.       q := q2; // и второй, с учетом, что он может оказаться прямо за первым
  9.       if (q^.pred <> nil) then q^.pred^.next := q^.next;
  10.       if (q^.next <> nil) then q^.next^.pred := q^.pred;
  11.       if(q = p) then p := p^.next; // тогда продвигаемся дальше
  12.       dispose(q);
  13.       printlist(head);
  14.     end

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

В данном коде на языке Free Pascal реализован алгоритм удаления из списка всех элементов, входящих в него в точности 2 раза.

  1. Проверка условия: Если c = 2, то есть если элемент встречается ровно дважды, то мы переходим к следующему шагу.
  2. Удаление первого: Мы сохраняем указатель на первый элемент списка, затем удаляем его. Если перед первым элементом есть другие элементы, то мы обновляем ссылку на следующий элемент перед первым. Если после первого элемента есть другие элементы, то мы обновляем ссылку на предыдущий элемент после первого. Затем мы переходим к следующему элементу списка.
  3. Удаление второго: Мы сохраняем указатель на второй элемент списка, затем удаляем его. Если перед вторым элементом есть другие элементы, то мы обновляем ссылку на следующий элемент перед вторым. Если после второго элемента есть другие элементы, то мы обновляем ссылку на предыдущий элемент после второго. Затем мы переходим к следующему элементу списка.
  4. Проверка условия: Если второй и первый элементы списка совпадают, то мы переходим к следующему шагу.
  5. Продвижение по списку: Мы обновляем указатель на голову списка, чтобы перейти к следующему элементу.
  6. Печать списка: Мы печатаем список. В итоге, после выполнения данного кода, в списке останутся только те элементы, которые встретились в списке не более одного раза.

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


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

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

14   голосов , оценка 3.714 из 5

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

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

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