Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лек_3.doc
Скачиваний:
4
Добавлен:
12.03.2015
Размер:
1.34 Mб
Скачать

5.3.2. Вывод списка

Вывод значений информационных полей на экран производится процедурой:

Procedure PrintList ( h :u );

Begin Writeln;

While h <> Nil Do { пока не достигнут конец списка }

Begin Write( h^.i:3); {вывод значения текущего элемента на экран}

h := h^.L; {переход к следующему элементу(узлу)}

End;

End;

Замечание. Переменная h в процедуре является локальной (в параметрах она указана без слова Var), поэтому ее изменения не будут касаться глобальной переменной h – головы списка.

5.3.2. Удаление элемента из списка.

Удаление заданного элемента из списка сводится к трем возможным случаям:

а) удаление спереди (удаление первого элемента списка);

б) удаление в середине;

в) нет удаляемого элемента.

Все варианты удаления реализованы в процедуре DelList.

Procedure DelList (Var h :u; a :integer); {a – значение удаляемого элемента}

Var p, t :u;

{ p, t – указатели соответственно на предыдущий и текущий узлы }

Begin

p := Nil; t := h; {встали на начало списка}

While t < > Nil Do {цикл просмотра списка}

If t^.i = a {если удаляемый элемент найден,

Then If p = Nil и если он первый в списке, то удаляем

Then Begin h := t^.L; Dispose(t); Exit; End как первый,

Else Begin p^. L := t^.L; Dispose(t); Exit; End иначе удаляем

как в середине}

Else Begin p := t; t := t^.L; End; {иначе продвижение вдоль списка}

Writeln( 'значения ', a:3, ' нет в списке' ); {удаляемый элемент не найден}

End;

5.3.2. Вставка в отсортированный список.

Вставка заданного элемента в отсортированный список сводится к четырем возможным случаям:

а) вставка в начало списка (вставка элемента списка как первого);

б) вставка в середину списка;

в) вставка в конец списка;

г) вставка в пустой список.

Все варианты вставки реализованы в процедуре InsList.

Procedure InsList (Var h :u; a :integer); {a – значение вставляемого элемента}

Var p, t ,s :u; { p,t,s – указатели соответственно на предыдущий,

текущий и вставляемый узлы }

Begin

New(s); { создали новый узел, ссылка на него в s }

s^.i := a; { a в новый узел }

t := h; {встали на начало списка}

p := Nil; { p - указатель на предыдущий узел}

{ Цикл поиска и вставки узла в надлежащее место списка }

While t < > Nil Do { пока не достигнут конец списка }

If t^.i > a { поиск места вставки }

Then { если место вставки найдено }

If p = Nil { и если р не успел измениться ,то}

Then Begin s^.L := h; h := s; Exit; End { вставка в начало списка}

Else Begin s^.L := t; p^.L := s; Exit; End { вставка в середину списка }

Else Begin p := t; t := t^.L; End;{ место вставки не найдено и переход к след. узлу }

{ конец цикла While }

If h = Nil Then Begin h := s; s^.L := Nil; End { вставка в пустой список }

Else Begin s^.L := Nil; p^.L := s; End; { вставка в конец списка }

End;

Процедуру InsList удобно использовать для создания отсортированного списка. Действительно, начав с пустого списка, каждое очередное значение аi вставляется и коммутируется в надлежащее в ему место в списке.

Procedure CreateSortList (Var h :u; k :integer); {k – длина списка}

Var j :Integer;

Begin

h := Nil;

For j := 1 To k Do InsList ( h, Random(50) );

End;

Для того, чтобы упростить алгоритмы операций вставки и удаления и свести их к однотипным операциям часто список снабжают дополнительным узлом, например, в начале списка - его называют заглавным узлом (звеном). В информационном поле заглавного узла может помещаться, например, количество узлов в списке или некоторая другая информация. Ниже приведены процедуры удаления и вставки, по ним видно - на сколько упрощается логика алгоритмов этих операций со списком.

Procedure DelListZ( h :u; a :Integer);

Var p,t :u;

Begin

p:=h; t:=h^.L;

While t <> Nil Do

If t^.i = a Then Begin p^.L := t^.L; Dispose(t); Exit; End

Else Begin p := t; t := t^.L; End;

Writeln('такого элемента нет');

End;

Procedure InsListZ( h :u; a :Integer);

Var p, t, s :u;

Begin

New(s); s^.i := a;

p:=h; t:=h^.L;

While (t<>Nil) And (t^.i <= a) Do

Begin p := t; t := t^.L; End;

p^.L := s; s^.L := t;

End;