Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Линейный двусвязный список




Begin

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

Слияние двух отсортированных списков в третий

Begin

Begin

Begin

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;

h:= Nil;

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

End;

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

 

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

Var p,t:u;

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;

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;

Пусть заданы два непустых и отсортированных по возрастанию списка h1 и h2. Получить объединенный отсортированный список за счет перекоммутации ссылок между узлами списков. Голова объединенного списка будет h1.

 

Procedure AddList (Var h1, h2:u);

Var p, t1, t2:u;

If h1^.i > h2^.i { добиваемся, чтобы h1 указывал на первый элемент с

Then Begin t1:=h1; h1:=h2; h2:=t1; End; меньшим значением}

t1:= h1; p:=Nil; t2:= h2;

Repeat {цикл объединения списков}

While (t1< > Nil) And (t1^.i <= t2^.i) Do Begin

p:=t1; t1:= t1^.L; { продвижение по текущему списку пока не

End; нужна перекоммутация }

p1^.L:= t2; t2:= t1; t1:= p^.L; { коммутация двух узлов из разных списков }

Until t2 = Nil; { если достигли конца одного из списков – задача выполнена }

End;

 

Рассмотренные ЛС являются структурами с последовательным доступом. Еще их называют односвязными, поскольку связи между узлами однонаправлены и просматривать элементы списка можно только от начала к концу. В некоторых практических задачах более эффективной структурой для представления данных яв­ляются двусвязные ЛС, где каждый элемент (узел) содержит ссылку не только на следующий, но и на предыдущий элементы. Обычно их еще называют R – правой ссылкой и L – левой ссылкой. В таких ЛС можно продвигаться как в пря­мом, так и обратном направле­ниях. Далее приведены соответст­вующие основные объявления и процедуры демонстрирующие ра­боту с двусвязными ЛС.




Поделиться с друзьями:


Дата добавления: 2014-01-11; Просмотров: 480; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.007 сек.