КАТЕГОРИИ: Архитектура-(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; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |