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

2. 7. Отображение

Отображение - функция, которая определена на множестве элементов одного типа main_type (тип области определения функции) и принимает значения из множества элементов другого типа – another_type (тип области значений). Тогда можно записать M(d)=r - отображение M ставит в соответствие элемент d типа main_type из области определения элементу r типа another_type из области значений.

Примером отображения является функция, которая ставит в соответствие работникам их недельную зарплату, при этом хранится текущий заработок каждого работника.

  1. Динамические структуры данных

Хотя динамика и не является отличительной чертой языка Паскаль, все же существует возможность создавать динамические объекты и оперировать с ними. Динамический объект представляет собой область памяти без идентификатора.

Структуры данных - это совокупность элементов данных и отношений между ними. При этом под элементами данных может подразумеваться как простое данное так и структура данных. Под отношениями между данными понимают функ­циональные связи между ними и указатели на то, где нахо­дятся эти данные (рис.12).

Рис. 12 - Графическое представление структуры дан­ных

Можно составлять цепочки или более сложные структуры ссылающихся друг на друга объектов. Размер таких структур ограничивается только объемом свободной памяти и может легко меняться при удалении и создании объектов, что и определило основную область их применения – моделирование нелинейных последовательных структур данных (например, деревьев).

Плюсы динамических структур:

  • размер структуры ограничивается только доступным объемом машинной памяти;

  • при изменении логической последовательности элементов структуры требуется не перемещение данных в памяти, а только коррекция указателей.

Динамические структуры тоже имеют свои минусы:

  • отсутствие наглядности программы – вызывает трудности при создании особо крупных структур.

  • работа с указателями требует, более высокой квалификации от программиста;

  • на поля связок расходуется дополнительная память;

  • доступ к элементам связной структуры может быть менее эффективным по времени.

Практически любой АТД может быть эффективным образом представлен как на массиве, так и на файле или на динамической структуре, но чаще всего конкретное представление обусловлено особенностью доступа к элементам рассматриваемого абстрактного типа.

3.1. Односвязные списки, кольцевой список

В односвязном списке поле INF - информационное поле, данные, NEXT - указатель на следующий элемент списка.

Каждый список должен иметь особый элемент, называемый указателем начала списка или головой списка, который по формату отличен от остальных элементов.

В поле указателя последнего элемента списка находится специальный признак nil, свидетельствующий о конце списка.

Рис. 13 - Структура односвязного списка

Кольцевой список, может быть организован на основе как односвязного, так и двухсвязного списков.

К ольцевой односвязный список получается из обычного односвязного спичка путем присваивания указателю последнего элемента списка значение указателя начала списка (рис. 14)

Рис. 14 – Структура кольцевого односвязный список

Операции, производимые над односвязными списками:

  • вставка в начало односвязного списка

Надо вставить в начало односвязного списка элемент с информационным полем D. Для этого необходимо сгенери­ровать пустой элемент (P=GetNode). Информационному по­лю этого элемента присвоить значение D (INFO(P)=s:D), зна­чению указателя на этот элемент присвоить значение указа­теля на начало списка (Ptr(P) = Lst), значению указателя на­чала списка присвоить значение указателя Р (Lst = Р).

  • удаление элемента из начала односвязного списка

надо удалить первый элемент списка, но запомнить ин­ формацию, содержащуюся в поле Info этого элемента. Для этого введем указатель Р, который будет указывать на уда­ ляемый элемент (Р = Lst). В переменную X занесем значение информационного поля Info удаляемого элемента (X=Info(P)). Значению указателя на начало списка присвоим значение Указателя следующего за удаляемым элемента (Lst = Ptr(P)). Удалим элемент (FreeNode(P)).

Примеры на Паскаль

  • любая структура информационной части списка:

type data = ...;

  • элемент односвязного списка (sll - single linked list): единственный список с использованием указателей

type

sllptr = ^slltype; { указатель в односвязном списке }

slltype = record { элемент односвязного списка }

inf : data; { информационная часть }

next : sllptr; { указатель на следующий элемент }

end;