Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОДНОСВ. СПИСКИ МУ.doc
Скачиваний:
15
Добавлен:
13.02.2015
Размер:
236.03 Кб
Скачать

Упражнение

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;