- •1 Линейные односвязные списки
- •2 Создание, просмотр и уничтожение списка
- •3 Добавление элемента в список
- •4 Перемещение элементов списка
- •Упражнения
- •5 ВсТаВка и удаление элементов списка
- •Упражнение
- •6 Поиск элемента в списке
- •7 Вставка и удаление элемента
- •Упражнение
- •Упражнения
- •8 Сортировка списка
- •9 Рекурсивные подпрограммы обработки списка
- •Упражнение
- •Упражнения
- •Упражнение
- •10 ЗаДаЧи
- •10.1 Нерекурсивные подпрограммы
- •10.2 Рекурсивные подпрограммы
- •Литература
Упражнение
1) Описать процедуру ViewRec_1 выдачи элементов списка в обратном порядке.
Пример 9.2 Рекурсивная функция вычисления суммы значений всех элементов списка.
Алгоритм вычисления суммы:
если список пуст, то сумма = 0,
иначе сумма = значение элемента + сумма следующих элементов списка.
function Sum(start:link):integer;
begin
if start=nil then Sum:=0
else Sum:=start^.inf+Sum(start^.next)
end;
Пример 9.3 Рекурсивная функция подсчёта числа вхождений заданного значения в список.
Алгоритм аналогичен алгоритму вычисления суммы.
function Cout(start:link; x:integer):integer;
begin
if start=nil then Cout:=0
else
if start^.inf = x then
Cout:= 1 + Cout(start^.next,x)
else Cout:= Cout(start^.next,x)
end;
Пример 9.4 Рекурсивная функция вычисления произведения значений элементов непустого списка.
Алгоритм аналогичен алгоритму вычисления суммы, но учитывается тот факт, что если среди элементов списка есть хотя бы один ноль, то произведение также равно нулю.
function Mult(start:link):integer;
begin
if start<>nil then
if start^.inf =0 then Mult:=0
else
Mult:=start^.inf * Mult(start^.next)
else Mult:=1
end;
Замечание. Проверка списка на пустоту должна выполняться в вызывающей программе.
Пример 9.5 Функция вычисления среднего арифметического значений элементов непустого списка.
Решение оформлено в виде нерекурсивной функции Average, которая содержит внутреннюю рекурсивную процедуру S_k с параметрами:
start – указатель на начало списка,
S – сумма значений элементов списка,
k – количество элементов списка.
function Average(start:link):real;
var S,k:integer; {сумма и число элементов списка}
{ рекурсивная процедура вычисления S и k }
procedure S_k(start:link; var S,k:integer);
begin
if start=nil then
begin
S:=0;
k:=0
end
else
begin
S_k(start^.next, S, k);
S:=S+start^.inf;
k:=k+1
end
end;
begin
S_k(start, S,k);
Average:=S/k
end;
Замечание. Проверка списка на пустоту должна выполняться в вызывающей программе.
Пример 9.6 Рекурсивная функция поиска в списке элемента с заданным значением x.
Алгоритм поиска элемента:
если список пуст, то возвращается пустая ссылка,
иначе если элемент найден, то возвращается ссылка на него,
иначе поиск элемента продолжается, начиная со следующего элемента.
function Search_Rec(start:link; x:integer): link;
begin
if start=nil then Search_Rec:=nil
else
if start^.inf=x then
Search_Rec:=start
else Search_Rec:= Search_Rec (start^.next, x)
end;
Пример 9.7 Рекурсивная процедура дублирования первого вхождения элемента списка с заданным значением x.
Алгоритм дублирования элемента:
если список не пуст, то
если найден элемент с заданным значением x,
то после него вставляется его дубликат,
иначе поиск элемента со значением x и вставка его дубликата продолжаются в "хвосте" списка, начиная со следующего элемента.
procedure Double(start:link; x:integer);
var p:link; {указатель на новый элемент}
begin
if start<>nil then
if start^.inf=x then
begin
new(p); p^.inf:=x;
p^.next:=start^.next; start^.next:=p
end
else Double(start^.next, x)
end;