Вопрос задан 25.08.2026 в 09:34. Предмет Информатика. Спрашивает Водяха Дарья.

Pascal ABC. Двунаправленный список. Удалить следующий элемент после нуля.
Создать двунаправленный связный список, содержащий 11 целых чисел из интервала [-5, 8]. Вывести список на экран.
Описать процедуру, которая удаляет элемент после нуля. Вывести новый список на экран.
Преподаватель сказал, что проблема в том, что создаётся список как двунаправленный, но обрабатывается не как двунаправленный. Возникала также проблема в том, что если ноль — первый или последний элемент, то программа выдаёт ошибку.

Перейти к ответам

Ответы на вопрос

Отвечает Казанников Артём.

В двунаправленном списке при удалении элемента нужно менять не только ссылку next, но и ссылку prev. Ошибка обычно появляется, если программа пытается обратиться к элементу, которого нет: например, ноль стоит последним, и после него нет следующего элемента.

Пример программы для PascalABC.NET:

type
  PNode = ^Node;
  Node = record
    data: integer;
    prev, next: PNode;
  end;

procedure AddLast(var head, tail: PNode; x: integer);
var p: PNode;
begin
  New(p);
  p^.data := x;
  p^.next := nil;
  p^.prev := tail;

  if head = nil then
    head := p
  else
    tail^.next := p;

  tail := p;
end;

procedure PrintList(head: PNode);
begin
  while head <> nil do
  begin
    write(head^.data, ' ');
    head := head^.next;
  end;
  writeln;
end;

procedure DeleteAfterZero(var head, tail: PNode);
var p, q: PNode;
begin
  p := head;

  while p <> nil do
  begin
    if p^.data = 0 then
    begin
      if p^.next <> nil then
      begin
        q := p^.next;
        p^.next := q^.next;

        if q^.next <> nil then
          q^.next^.prev := p
        else
          tail := p;

        Dispose(q);
      end;
      exit;
    end;

    p := p^.next;
  end;
end;

var
  head, tail: PNode;
  i, x: integer;
begin
  randomize;
  head := nil;
  tail := nil;

  for i := 1 to 11 do
  begin
    x := random(14) - 5;
    AddLast(head, tail, x);
  end;

  writeln('Исходный список:');
  PrintList(head);

  DeleteAfterZero(head, tail);

  writeln('Новый список:');
  PrintList(head);
end.

Здесь проверка if p^.next <> nil защищает программу от ошибки, когда ноль стоит последним. Если удаляемый элемент был последним, переменная tail переносится на предыдущий элемент. Поэтому список действительно обрабатывается как двунаправленный.

Похожие вопросы

Топ вопросов за вчера в категории Информатика

Последние заданные вопросы в категории Информатика

Задать вопрос