
- •1 Основные принципы перегрузки операций
- •Запреты на перегрузку операций
- •3 Структуры
- •Доступ к элементам структур
- •Динамическое распределение памяти
- •Связанные списки
- •Очереди
- •7. Программные продукты и их основные характеристики: основные понятия программного обеспечения; характеристики программных продуктов; защита программных продуктов; классификация программных продуктов
- •4. Классы программных продуктов
- •1) Составление технического задания на программирование
- •2) Составление технического проекта
- •3) Создание рабочей документации (рабочего проекта)
- •4) Ввод в действие
- •1) Диалоговый режим
- •2) Графический интерфейс пользователя
- •9. Сети эвм и протоколы передачи информации:
- •10. Экспертные системы: архитектура, типы решаемых задач, методика построения, области применения. Различные подходы к построению систем ии.
- •11. Понятие модели данных. Иерархическая, сетевая, реляционная, объектная модель. Типы структур данных. Операции над данными. Ограничения целостности.
- •2.3. Иерархическая модель данных (имд)
- •12. Нормализация отношений. Нормальные формы. Запросы и операторы манипулирования данными. Язык запросов sql.
Динамическое распределение памяти
Создание и использование динамических структур данных требует динамического распределения памяти - возможности получать в процессе исполнения дополнительную память для хранения новых узлов и освобождать блоки памяти, ставшие ненужными. Максимальный размер выделяемой динамически памяти определяется доступной физической памятью компьютера или доступным виртуальным адресным пространством в системе с виртуальной памятью. Однако часто эти размеры значительно меньше, потому что память разделяется между многими пользователями (задачами).
Для динамического распределения памяти необходимо применение функций malloc и free, а также операции sizeof. Функция malloc принимает в качестве аргумента число байт, которое необходимо выделить, и возвращает указатель на выделенную память типа void*. Указатель void* можно присвоить любой переменной-указателю. Функция malloc обычно используется совместно с операцией sizeof. Например, оператор
newPtr = malloc(sizeof(struct node));
оценивает sizeof(struct node) для определения размера в байтах структуры типа struct node, выделяет новый блок памяти размером в sizeof(struct node) байт, и сохраняет указатель на выделенную память в переменной newPtr. Если необходимого количества памяти нет в наличии, malloc возвращает указатель NULL.
Функция free освобождает память, т.е. память возвращается системе, и в дальнейшем ее можно выделить снова. Для высвобождения памяти, динамически выделенной предыдущим вызовом оператора malloc, используется оператор
free(newPtr);
Связанные списки
Связанный список - это линейный набор ссылающихся на себя структур, называемых узлами, и объединенных указателем-связкой, отсюда и название - «связанный» список. Доступ к связанному списку обеспечивается указателем на первый узел списка. Доступ к следующим узлам производится через связывающий указатель, хранящийся в каждом узле. По общему соглашению связывающий указатель в последнем узле списка устанавливается в NULL, отмечая конец списка. Данные хранятся в связанном списке динамически - каждый узел создается по мере необходимости. Узел может содержать данные любого типа, включая другие структуры. Стеки и очереди также принадлежат к линейным структурам данных, и, как мы увидим, являются специальными вариантами связанных списков. Деревья же являются нелинейными структурами данных.
Списки данных могут храниться в массивах, однако связанные списки дают определенные преимущества. Связанный список удобен, когда заранее не известно, сколько элементов данных будет содержать структура. Связанные списки являются динамическими, поэтому длина списка при необходимости может увеличиваться или уменьшаться.
Стеки
Стек - это упрощенный вариант связанного списка. Новые узлы могут добавляться в стек и удаляться из стека только сверху. По этой причине, стек часто называют структурой вида последним пришел - первым вышел (LIFO). На стек ссылаются через указатель на верхний элемент стека. Связывающий элемент в последнем узле стека установлен равным NULL, чтобы пометить границу стека.
Разница между стеком и связанными списками в том, что вставку и удаление в связанных списках можно выполнять в любом месте, а в стеке только сверху.
Основные функции, используемые при работе со стеками - push и pop. Функция push создает новый узел и помещает его на вершину стека. Функция pop удаляет верхний узел стека, освобождает память, которая была выделена изъятому узлу, и возвращает изъятое значение.
Стеки имеют множество разнообразных применений. Например, всякий раз, когда происходит вызов функции, вызванная функция должна знать, как вернуться к вызывающей, поэтому адрес возврата помещается в стек. В случае, когда происходит целый ряд последовательных вызовов, адреса возврата размещаются в стеке в порядке последним пришел - первым вышел, так что после завершения выполнения каждой функции происходит переход к функции, ее вызывавшей.