Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
otvety_proga.docx
Скачиваний:
17
Добавлен:
08.08.2019
Размер:
51.93 Кб
Скачать
  1. Списки.

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

Достоинства:

лёгкость добавления и удаления элементов

размер ограничен только объемом памяти компьютера и разрядностью указателей

Недостатки

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

на поле указателей расходуется дополнительная память (в массивах, например, указатели не нужны)

работа со списком медленнее, чем с массивами, так как к любому элементу списка можно обратится, только пройдя все предшествующие ему элементы

Отличие списков от массивов:

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

Работа с динамическими величинами связана с использованием еще одного типа данных — ссылочного типа. Величины, имеющие ссылочный тип, называют указателями.

Указатель содержит адрес поля в динамической памяти, хранящего величину определенного типа. Сам указатель располагается в статической памяти.

Адрес величины — это номер первого байта поля памяти, в котором располагается величина. Размер поля однозначно определяется типом.

Nil — это зарезервированная константа, обозначающая пустую ссылку, т.е. ссылку, которая ни на что не указывает.

NEW(<указатель>)

DISPOSE(<указатель>)

Сами динамические величины не требуют описания в программе, поскольку во время компиляции память под них не выделяется. Во время компиляции память выделяется только под статические величины. Указатели — это статические величины, поэтому они требуют описания.

В качестве ссылочного выражения можно использовать

указатель;

ссылочную функцию (т.е. функцию, значением которой является указатель);

константу Nil.

NEW(D); NEW(P);

{Выделено место в динамической памяти под две целые переменные. Указатели получили соответствующие значения}

D^ := 3; P^ := 5;

{Динамическим переменным присвоены значения}

P := D;

{Указатели P и D стали ссылаться на одну и ту же величину, равную 3}

WriteLn(P^, D^); {Дважды напечатается число 3}

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

Inf — информационная часть звена списка (величина любого простого или структурированного типа, кроме файлового), Next — указатель на следующее звено списка; First — указатель на заглавное звено списка.

Если указатель ссылается только на следующее звено списка (как показано на рисунке и в объявленной выше структуре), то такой список называют однонаправленным, если на следующее и предыдущее звенья — двунаправленным списком. Если указатель в последнем звене установлен не в Nil, а ссылается на заглавное звено списка, то такой список называется кольцевым. Кольцевыми могут быть и однонаправленные, и двунаправленные списки.

Выделим типовые операции над списками:

добавление звена в начало списка;

удаление звена из начала списка;

добавление звена в произвольное место списка, отличное от начала (например, после звена, указатель на которое задан);

удаление звена из произвольного места списка, отличного от начала (например, после звена, указатель на которое задан);

проверка, пуст ли список;

очистка списка;

Выражение типа head^.next^.key дает нам первый элемент списка, а head^. Next^.next^.key - второй.

рование списков

  1. Стек

Стек (англ. stack — стопка) — структура данных с методом доступа к элементам LIFO (Last In — First Out, последним пришел — первым вышел). Чаще всего принцип работы стека сравнивают со стопкой тарелок: чтобы взять вторую сверху, нужно взять верхнюю.

Добавление элемента, называемое также проталкиванием (push), возможно только в вершину стека (добавленный элемент становится первым сверху), выталкивание (pop) — также только из вершины стека, при этом второй сверху элемент становится верхним.

*Создание стека.

1. Выделение памяти под первый элемент стека и занесение в него информации:

2. Установка вершины стека Top на созданный элемент:

* Добавление элемента стека.

1. Выделение памяти под новый элемент стека. Внесение значения в информационное поле нового элемента и установка связи между ним и "старой" вершиной стека Top:

2. Перемещение вершины стека Top на новый элемент:

* Удаление элемента стека.

1. Извлечение информации из информационного поля вершины стека Top в переменную Val и установка на вершину стека вспомогательного указателя P:

2. Перемещение указателя вершины стека Top на следующий элемент и освобождение памяти, занимаемой "старой" вершиной стека:

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]