КАТЕГОРИИ: Архитектура-(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) |
Interface
Стек. End End Then Вставка заданного элемента в отсортированный 2-связный список. End End Then Begin Удаление в 2-связном списке. Создание 2-связного списка. Type u = ^Uzl; Uzl = Record i:Integer; L, R:u; End; Var h:u; Procedure Create2List (Var h:u; n:Word); {n – количество узлов} Var t:u; k:Word; Begin New(h); h^.i:= Random(50); h^.L:= Nil; t:= h; {создали новый узел} For k:=1 To n-1 Do Begin New (t^.R); и подключили его к R – ccылке предыдущего узла} t^.R^.L:= t; {в ссылочное поле нового узла записали L - ссылку } t:= t^.R; {указатель t переместили на новый узел } t^.i:= Random(50); { заполнили информационное поле нового узла } End; t^.R:= Nil; { R - ссылка последнего узла равна Nil} End; Procedure Del2List (Var h:u; a:Integer); Var t:u; t:= h; While t <> Nil Do If t^.i = a If t = h Then Begin t:= t^.R; Dispose (t^.L); {удаление спереди} t^.L:= Nil; h:=t; Exit; Else Begin t^.L^.R:= t^.R; {удаление в середине} t^.R^.L:= t^.L; Dispose(t); Exit; Else t:= t^.R; { продвижение вдоль списка} Writeln(' нет такого элемента в списке '); End; Procedure Ins2List (Var h:u; a:Integer); Var t, s:u; Begin t:= h; New (s); s^.i:= a; While t <> Nil Do Цикл поиска и вставки узла в надлежащее место списка} If a <= t^.i If t = h { если место вставки найдено } Then Begin s^.L:= Nil; s^.R:= h; { вставка в начало списка } t^.L:= s; h:= s; Exit; Else Begin s^.L:= t^.L; t^.L:= s; { вставка в середину списка } s^.R:= t; s^.L^.R:= s; Exit; Else If t^.R = Nil {если t указывает на последний элемент, Then Break { то выход, Else t:= t^.R; иначе продвигаемся вперед} { конец цикла While } If h = Nil Then Begin h:= s; s^.L:= Nil; s^.R:= Nil; End { вставка в пустой список } Else Begin s^.L:= t; s^.R:= Nil; t^.R:= s; End; { вставка в конец списка } End; Замечания. 1. Обратите внимание, что Pascal допускает многократное применение операции ^ (разыменование) в одном выражении, что позволяет, имея указатель на какой-либо узел, обращаться к полям нескольких соседних узлов, продвигаясь по ссылкам. Такая «косвенная адресация» к различным элементам списка является удобным средством обработки. 2. Часто для ускорения доступа к элементам 2-связного списка его снабжают еще одним указателем h2 на конец списка. 3. В операциях с 2-связными списками удается избавиться от рабочего указателя p на предыдущий элемент. 4. На основе рассмотренных операций над списками можно сделать простые и важные выводы. Если имеется последовательность элементов одного типа, то представление ее в виде списка особенно удобно в тех ситуациях, когда часто должны выполняться операции удаления и/или вставки произвольных элементов последовательности и когда используется прохождение всего списка. Массивы и файлы, безусловно, хуже списков, если рассматривать операции удаления и/или вставки произвольных элементов. Для массивов требуется смещение элементов, а для файлов — перезапись. Последовательная обработка массивов происходит несколько быстрее, чем последовательная обработка списков, а последовательная обработка файлов — медленнее. Массивы имеют определенные преимущества перед списками при произвольном доступе к элементам, особенно эффективен поиск определенного элемента в упорядоченном массиве. Этот тип поиска в случае списков относится к очень медленному и требует в среднем п/2 обращений к элементам списка и сравнений. Если ожидается, что элементы будут выбираться из середины или конца списка, то не требуется его последовательно просматривать, а нужно хранить несколько указателей на эти части списка.
Стек — частный случай линейного односвязного списка, для которого разрешено добавлять или удалять элементы только с одного конца списка, который называется вершиной стека (рис. 5.2). Такой принцип доступа к данным называется LIFO (Last In First Out – «последним пришел – первым вышел»). Голову списка в данном случае называют еще указателем стека (stack pointer – sp, однако в целях общности будем как и прежде придерживаться обозначения h). Стек имеет важное значение для организации межмодульного взаимодействия, организации прерываний, рекурсивных вычислений и еще много других полезных применений, с которыми мы познакомимся в ходе изучения различных алгоритмов. Удобно все операции со стеком оформить в виде процедур и функций и поместить в отдельный модуль. Ниже приводится пример такого модуля, в котором информационное поле элемента стека относится к символьному типу. Если нужен стек с другим типом элементов, то в этот модуль необходимо внести соответствующие изменения. UNIT Stack; Type u = ^Uzl; Uzl = Record i:Char; {информационное поле символьного типа } L:u; End; { далее h – формальный параметр! } Procedure Push (Var h:u; a:Char); { включение в стек нового элемента.} Function Pop (Var h:u):Char; {исключение элемента из стека } Function Empty (h:u):Boolean; {функция «пустой» стек} Function Top (h:u):Char; {функция возвращает копию вершины}
Дата добавления: 2014-01-11; Просмотров: 396; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |