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 переносится на предыдущий элемент. Поэтому список действительно обрабатывается как двунаправленный.
Похожие вопросы
Топ вопросов за вчера в категории Информатика
Последние заданные вопросы в категории Информатика
-
Математика
-
Литература
-
Алгебра
-
Русский язык
-
Геометрия
-
Английский язык
-
Химия
-
Физика
-
Биология
-
Другие предметы
-
История
-
Обществознание
-
Окружающий мир
-
География
-
Українська мова
-
Информатика
-
Українська література
-
Қазақ тiлi
-
Экономика
-
Музыка
-
Право
-
Беларуская мова
-
Французский язык
-
Немецкий язык
-
МХК
-
ОБЖ
-
Психология
-
Физкультура и спорт
-
Астрономия
-
Кыргыз тили
-
Оʻzbek tili

