- •1 Линейные односвязные списки
- •2 Создание, просмотр и уничтожение списка
- •3 Добавление элемента в список
- •4 Перемещение элементов списка
- •Упражнения
- •5 ВсТаВка и удаление элементов списка
- •Упражнение
- •6 Поиск элемента в списке
- •7 Вставка и удаление элемента
- •Упражнение
- •Упражнения
- •8 Сортировка списка
- •9 Рекурсивные подпрограммы обработки списка
- •Упражнение
- •Упражнения
- •Упражнение
- •10 ЗаДаЧи
- •10.1 Нерекурсивные подпрограммы
- •10.2 Рекурсивные подпрограммы
- •Литература
Упражнение
1) Описать решение задачи вставки элемента в список в виде процедуры Insert_4.
Пример 7.2 Удалить из списка элемент со значением, равным заданному значению x.
procedure Del_2(var start:link; x:integer);
var p,pr:link; {указатели на текущий и предыдущий элементы}
fl:boolean;
begin
if start <> nil then
begin
p:=start;
if start^.inf=x then {удаление первого элемента}
begin
start:=start^.next; dispose(p)
end
else
begin
fl:=true;
pr:=p; p:=p^.next;
while (p<>nil) and fl do {поиск элемента}
if p^.inf=x then fl:=false
else
begin
pr:=p; p:=p^.next;
end;
if not fl then
begin
pr^.next:=p^.next; dispose(p)
end
end
end
end;
Упражнения
1) Изменить процедуру Del_2 так, чтобы в вызывающей программе было возможно проверить факт удаления элемента из списка.
2) Описать решение задачи удаления элемента из списка в виде функции Del_3, которая возвращает значение true, если элемент со значением x был удален, и значение false, если среди элементов списка нет элемента со значением x.
8 Сортировка списка
Пример 8.1 Отсортировать список по неубыванию, то есть упорядочить элементы списка в порядке неубывания их значений.
Для сортировки списка будет использован вариант обменной сортировки (метода " пузырька" ) [6], который учитывает, что уже отсортированный "хвост" списка не будет участвовать в просмотре.
Алгоритм можно улучшить, если запоминать "место" последнего обмена элементов.
procedure Sort(var start:link);
var p, {указатель на текущий элемент списка}
q, {указатель на следующий элемент}
t: {указатель на отсортированный "хвост" списка}
r:link; {указатель на "место" последнего обмена}
fl:boolean; {признак обмена}
x:integer;
begin
fl:=true;
t:=nil; {"хвост" пуст}
while fl do
begin
fl:=false; {обмена еще не было}
p:=start; {указатель на начало списка}
q:=p^.next; {указатель на второй элемент}
while q<>t do
begin
if p^.inf > q^.inf then
begin
x:=p^.inf; {обмен значениями элементов}
p^.inf:= q^.inf;
q^.inf:=x;
fl:=true; {зафиксирован обмен}
r:=q {и "место" обмена}
end;
p:=q; q:=q^.next
end;
t:=r {запоминается адрес отсортированной части списка}
end
end;
9 Рекурсивные подпрограммы обработки списка
Линейный односвязный список, как структура данных, может быть определен рекурсивно:
– либо как пустой,
– либо как совокупность элемента определенного типа и списка элементов того же типа.
Поэтому естественно применить к списку методы рекурсивной обработки. Однако не следует забывать что, когда есть очевидное итерационное решение (см. разделы 2 – 7), лучше не применять рекурсий.
Пример 9.1 Рекурсивная процедура просмотра списка.
Алгоритм просмотра списка – вывода значений элементов списка:
если список не пуст, то
вывести значение элемента списка,
затем вывести значения остальных элементов, начиная со следующего элемента.
procedure ViewRec(start:link);
begin
if start<>nil then
begin
write(start^.inf,' ');
ViewRec(start^.next)
end
else
writeln
end;
