Предмет: Информатика,
автор: wf2507
Pascal ABC. Двунаправленный список. Удалить следующий элемент после нуля
Создать двунаправленный связный список, содержащий 11 целых чисел из интервала [8, -5]. Вывести список на экран.
Описать процедуру, которая удаляет элемент после нуля. Вывести новый список на экран.
Преподаватель сказал, что проблема в том, что создается список как двунаправленный , но обрабатывается не как двунаправленный. Возникала так же проблема в том, что если ноль первый и последний элемент, то программа выдает ошибку. Прошу помогите
Приложения:
Ответы
Автор ответа:
1
program spiski;
type
ListElement = ^TListElement;
TListElement = record
Data: integer;
Next, Previous: ListElement;
end;
var
first, current, last: ListElement;
i: integer;
procedure Delete(var element: ListElement);
var
x: ListElement;
begin
while element <> nil do
begin
if (element^.Data = 0) and (element^.Next <> nil) then begin
x := element^.Next; {следующий элемент который надо удалить}
{сшиваем дырку которая образуется после удаления х}
element^.Next := x^.Next;
if (x^.Next <> nil) then
x^.Next^.Previous := element;
Dispose(x);
end;
element := element^.Next;
end;
end;
procedure Print(first: ListElement);
begin
if first = nil then
begin
writeln('Список пуст.');
exit;
end;
while first <> nil do
begin
Write(first^.Data, ' ');
first := first^.Next
end;
writeln;
end;
begin
for i := 1 to 11 do
begin
if first = nil then
begin
new(first);
first^.Next := nil;
first^.Previous := nil;
last := first;
end
else
begin
new(last^.Next);
last^.Next^.Previous := last;
last := last^.Next;
last^.Next := nil;
end;
last^.Data := random(8 + 5) - 5;
end;
current := first;
Print(first);
Delete(current);
Print(first);
end.
type
ListElement = ^TListElement;
TListElement = record
Data: integer;
Next, Previous: ListElement;
end;
var
first, current, last: ListElement;
i: integer;
procedure Delete(var element: ListElement);
var
x: ListElement;
begin
while element <> nil do
begin
if (element^.Data = 0) and (element^.Next <> nil) then begin
x := element^.Next; {следующий элемент который надо удалить}
{сшиваем дырку которая образуется после удаления х}
element^.Next := x^.Next;
if (x^.Next <> nil) then
x^.Next^.Previous := element;
Dispose(x);
end;
element := element^.Next;
end;
end;
procedure Print(first: ListElement);
begin
if first = nil then
begin
writeln('Список пуст.');
exit;
end;
while first <> nil do
begin
Write(first^.Data, ' ');
first := first^.Next
end;
writeln;
end;
begin
for i := 1 to 11 do
begin
if first = nil then
begin
new(first);
first^.Next := nil;
first^.Previous := nil;
last := first;
end
else
begin
new(last^.Next);
last^.Next^.Previous := last;
last := last^.Next;
last^.Next := nil;
end;
last^.Data := random(8 + 5) - 5;
end;
current := first;
Print(first);
Delete(current);
Print(first);
end.
archery:
Извини за небольшой рефакторинг, но так было легче разобраться в написаном.
Похожие вопросы
Предмет: Русский язык,
автор: андрей2158
Предмет: Английский язык,
автор: Алина11245
Предмет: Русский язык,
автор: alesga89
Предмет: Физика,
автор: nurmakhammatov