Удалить из списка заданный элемент, добавить в конец новый элемент, напечатать список в обратном порядке - PascalABC.NET
Формулировка задачи:
Прошу помощи!
Пусть дан циклический двунаправленный список, с информативным полем - целое число:
а) удалить из списка первый отрицательный отрицательный элемент.
б) добавить в конец списка новый элемент.
в) печать элементы в обратном порядке.
Решение задачи: «Удалить из списка заданный элемент, добавить в конец новый элемент, напечатать список в обратном порядке»
textual
Листинг программы
type
tList = class
Data : Integer;
Pred, Next : tList;
constructor (N : Integer);
begin
Data := N;
Pred := nil; Next := nil;
end;
end;
procedure OutList(List : tList);
begin
var Cur := List;
repeat
Print(Cur.Data);
Cur := Cur.Next;
until Cur = List;
WriteLn;
end;
begin
// Создаём список из 20 элементов
Randomize;
var List := New tList(Random(-10,+10));
var Last := List;
for var N := 2 to 20 do
begin
Last.Next := New tList(Random(-1,+10));
Last.Next.Pred := Last;
Last := Last.Next;
end;
List.Pred := Last;
Last.Next := List;
WriteLn('Создан список');
OutList(List);
// Удалить первый отрицательный (список не может быть пустым)
var Cur := List;
while (Cur.Data >= 0) and (Cur.Next <> List) do
Cur := Cur.Next;
if Cur.Data >= 0 then
WriteLn('В списке нет отрицательных!')
else
begin
Cur.Pred.Next := Cur.Next;
Cur.Next.Pred := Cur.Pred;
if Cur = List then
List := List.Next;
WriteLn('Удалён первый отрицательный');
OutList(List);
end;
// Добавить новый в конец
var Add := New tList(ReadLnInteger('Введите число:'));
Add.Pred := List.Pred;
List.Pred.Next := Add;
List.Pred := Add;
Add.Next := List;
WriteLn('Добавлен новый в конец');
OutList(List);
// Обратный порядок
WriteLn('Список в обратном порядке:');
var Tmp := List.Pred;
repeat
Print(Tmp.Data);
Tmp := Tmp.Pred;
until Tmp = List.Pred;
WriteLn;
end.
Объяснение кода листинга программы
- Объявлена структура данных tList, представляющая собой связный список.
- В процедуре OutList список выводится на экран по порядку.
- Создаётся список из 20 элементов с помощью оператора New и цикла for.
- Первый отрицательный элемент (если он есть) удаляется с помощью цикла while и рекурсии (если список не может быть пустым).
- В цикле while запрашивается ввод нового элемента и добавляется в конец списка.
- Список выводится на экран в обратном порядке с помощью цикла repeat и рекурсии.