Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛекцииЯзыки прогрИб.doc
Скачиваний:
27
Добавлен:
12.11.2019
Размер:
922.11 Кб
Скачать

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

10.1. Списки: основные виды и способы реализации

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

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

Связные списки (linked lists) – наборы элементов данных, называемых узлами, связанные при помощи связующих указателей в линейную структуру данных, причем операции вставки элементов данных и их удаления осуществляются в любом месте списка. Каждый узел содержит адреса (связующие указатели) последующего и предыдущего указателя списка (прямые и обратные цепочки). Доступ к связному списку начинается через указатель на первый элемент списка, а затем через связующие указатели каждого списка.

Стеки (stacks) – частный случай связных списков, в которых операции вставки и удаления проводятся в конце стека (в его вершине), т.е. по принципу «первый пришел, последний ушел»; применяется в компиляторах и операционных системах. Пример использования стеков и описание алгоритмов операций с элементами списка представлен в § 7.1 при программировании класса «spisok» методом объектно-ориентированного программирования.

Очереди (queues) - частный случай связных списков, в которых операция вставки проводится в конце очереди (хвосте очереди), а операция удаления проводится в начале очереди (голове очереди), т.е. по принципу «первый пришел, первый ушел».

Бинарные деревья (binary trees) – нелинейные структуры данных, обеспечивающие высокоскоростной поиск и сортировку данных.

10.2. Динамическое выделение памяти

Создание и сопровождение динамических структур данных ведет к динамическому распределению памяти, т. е. к наращиванию и сокращению области памяти в процессе выполнения программы.

Для управления динамической памятью используются:

оператор new для резервирования памяти из heap (кучи);

оператор delete для освобождения памяти.

Синтаксис оператора new (три формы):

new <тип> или new (<тип>) //резервирование памяти под

//объект типа <тип>;

new <тип>(x) //резервирование памяти и инициализация

//значением x

new <тип>[<выражение>] //резервирование под массив

//типа <тип>.

Примеры оператора new:

int* p1=new int; //резервирование памяти под объект

//типа int

int* p2=new int(5); //резервир. и инициализация значением x

char* tabn=new char[20]; //резервир. под массив типа char

t* p=new t; //резервир. под переменную типа структура t:

//struct t {char tabn[10]; float oklad;}

Результат оператора new – указатель на выделенную память, либо 0, если произошла ошибка.

Синтаксис оператора delete имеет две формы:

delete p; //освобождение памяти, p – указатель из new

delete[] p; //освобождение памяти, занятой массивом

Примеры оператора delete:

delete p1; //освобождение памяти, на которую указывает p1

delete[] tabn; //освобождение массива, на который указывает tabn

Операторы new и delete особенно эффективны при работе с объектами классов в объектно-ориентированном программировании.

Сравним структуры данных фиксированного размера (массивы) и динамические структуры данных (списки) с точки зрения их использования при программировании. Списки эффективны по сравнению с массивами в тех случаях, когда число элементов данных в структуре данных заранее не известно и может изменяться во время выполнения программы. Конечно, можно и в этих случаях использовать массивы, объявив заранее массив под максимальное число элементов, но это приведет к избыточному расходу памяти. Таким образом, связные списки экономят память.

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

Но массивы имеют огромное преимущество, связанное с быстрым доступом к элементам массива, так как адрес индексированного элемента массива вычисляется мгновенно по отношению к началу массива. Это объясняется распределением памяти под массив, когда элементы массива размещаются в памяти непрерывно. И в этом недостаток списков, так как узлы списков физически не хранятся в памяти по соседству друг с другом.

Контрольные вопросы

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

  2. Какие существуют основные виды списков?

  3. Охарактеризуйте динамический класс памяти.

  4. Сравните структуры данных фиксированного типа (массивы) с динамическими структурами данных (списки).