- •Содержание
- •1 Списковые структуры и динамическая память 10
- •2 Списковые структуры и файлы 79
- •3 Мультисписковые структуры 121
- •4 Указатели на функции 134
- •5 Совместное использование указателей на данные и указателей на функции 141
- •6 Оформление курсового проекта 157
- •Введение
- •1Списковые структуры и динамическая память
- •1.1Представления однонаправленных списков массивами указателей на элементы списка
- •1.1.1Представление однонаправленных списков массивами указателей
- •1.1.2Статические массивы указателей
- •1.1.3Операции со списками в статических массивах указателей
- •1.1.4Статические массивы указателей в динамической памяти
- •1.1.5Операции со списками в статических массивах указателей в динамической памяти
- •1.1.6Динамические массивы указателей
- •1.1.7Динамические массивы типизированных указателей
- •1.1.8Операции со списками в динамических массивах типизированных указателей
- •1.1.9Динамические массивы нетипизированных указателей
- •1.1.10Операции со списками в динамических массивах нетипизированных указателей
- •1.1.11Продолжение. Динамические массивы нетипизированных указателей
- •1.1.12Замечания по оператору &
- •1.1.13Нетипизированые указатели и массивы
- •1.1.14Нетипизированые указатели и память
- •1.1.15Продолжение. Динамические массивы нетипизированных указателей
- •2Списковые структуры и файлы
- •2.1Бестиповые файлы и однонаправленные списки на базе массивов указателей на элементы списка
- •2.1.1Представление однонаправленных списков массивами указателей
- •2.1.2Организация файла с однонаправленным списком на базе массивов указателей на элементы списка
- •2.1.3Статические и динамические массивы указателей
- •2.1.4Организация списка дыр
- •2.1.5Функция инициализации файла со списком
- •2.1.6Функция открытия файла со списком
- •2.1.7Функции корректировки указателя на начало списка, заголовка списка дыр, количества элементов списка и текщего размера массива указателей
- •2.1.8Функция выделения записи для нового элемента списка
- •2.1.9Функция освобождения записи удаляемого элемента списка
- •2.1.10 Функция увеличения размера массива указателей на элементы списка
- •2.1.11 Функция вывода содержимого списка
- •2.1.12 Функция поиска элемента списка
- •2.1.13Функция добавления элемента в неотсортированный список
- •2.1.14Функция добавления элемента в отсортированный список
- •2.1.15Функция удаления элемента из отсортированного списка
- •2.1.16Функция удаления списка
- •2.1.17 Функция удаления списка с усечением файла
- •2.1.18 Пример программы обработки отсортированного списка на базе массивов указателей
- •2.1.19Продолжение. Представление однонаправленных списков массивами указателей
- •2.1.20Функция инициализации файла со списком
- •2.1.21Процедура открытия файла со списком
- •2.1.22Процедура корректировки заголовка списка
- •2.1.23 Процедура увеличения размера массива указателей на элементы списка
- •2.1.24Функция поиска элемента списка или позиции вставки нового элемента методом половинного деления
- •2.1.25Функция вывода списка на экран
- •2.1.26Функция добавления нового элемента в отсортированный список
- •2.1.27Функция удаления элемента из отсортированного списка
- •2.1.28Функция удаления списка с усечением файла
- •3Мультисписковые структуры
- •3.1Назначение мультисписков
- •3.2Мультисписки в динамической памяти
- •3.3Мультисписки в бинарных файлах
- •3.4Сохранение и восстановление мультисписка в динамической памяти
- •4Указатели на функции
- •4.1Понятие указателя на функцию и его объявление
- •4.2Переменная-указатель на функцию как параметр другой функции
- •4.3Условия использования указателей на функции
- •4.4Использование указателей на функцию для вызова функций
- •4.4.1Формат переменных-указателей на функцию и бестиповых указателей
- •4.4.2Преобразование переменной-указателя на функцию к бестиповому указателю на функцию
- •4.4.3Вызов функции через бестиповый указатель на функцию
- •4.4.4Преобразование бестипового указателя к переменной типа указатель на функцию
- •4.5Способы вызова функции через указатель на функцию
- •4.5.1Массивы указателей на функции
- •5Совместное использование указателей на данные и указателей на функции
- •5.1Инвариантные функци
- •5.2Функции сравнения
- •5.3Пример 1
- •5.4Пример 2
- •6Оформление курсового проекта
- •6.1Интерфейс программной системы
- •6.2Взаимодействие с мультисписком
- •6.3Отображение содержимого мультисписка
- •6.4Файл справки
- •6.5Документация по курсовому проекту
- •6.5.1Общие положения
- •6.5.2Курсовой проект/работа
- •6.5.3Пояснительная записка
- •6.5.4Техническое задание
- •6.5.5Реферат
- •6.5.6Содержание
- •6.5.7Введение
- •6.5.8 Постановка задачи
- •6.5.9 Анализ решаемой задачи
- •6.5.10Анализ существующих методов организации динамических структур данных
- •6.5.11 Определение путей и методов решения задачи
- •6.5.12Проектирование программы
- •6.5.13Заключение
- •6.5.14Список использованных источников
- •6.6Приложения
2.1.19Продолжение. Представление однонаправленных списков массивами указателей
В предыдущих разделах, при реализации однонаправленных списков массивами указателей на элементы списка, для хранения служебной информации о размере массива и о размере списка используются две специальные фиксированные области (записи) – размер выделенного массива указателей на элементы списка и реальное количество элементов списка. Это не всегда удобно, особенно если нетипизированный файл используется для представления нескольких списков. Действительно в последнем случае растет количество таких областей, что усложняет работу с программой. И принципиально это невозможно, если число списков заранее не известно.
Возможным альтернативным решением является хранение служебной информации о массиве указателей в самом массиве. Предпосылками к этому является то, что пространство, отводимое в нетипизированном файле под массив указателей, является соответствующим блоком байт. А уже затем этот блок или его части считываются в переменные определенных типов. Но тогда переменные, в которые считывается конкретный блок, могут иметь разные типы. Следовательно, по мере необходимости разные участки массива указателей могут считываться в переменные разных типов. Такая техника работы с нетипизированным файлом, а следовательно и с массивом, хранящимся в этом файле, позволяет по-разному рассматривать разные его части.
Таким образом, одну часть массива можно рассматривать, как служебную информацию, характеризующую этот массив, а другую часть, как собственно набор указателей на элементы списка.
В рамках конкретной программы обработки списков весь выделяемый массив байт рассматривается как состоящий из двух смежных частей. Первая часть массива содержит служебную информацию - два элемента типа int, соответственно общий размер массива и фактическое количество элементов списка. А вторая часть массива используется для хранения указателей – элементы типа int, на узлы (элементы) списка.
Таким образом, начальная структура файла приобретает следующий вид:
№ бт |
0 3 |
4 7 |
Массив указателей на элементы списка |
… |
M |
||
8 8 + 2*4 + N*4 - 1 |
|||||||
|
Заголовок списка "дыр" |
Указатель на массив указателей на элементы списка |
Размер массива указателей N |
Количество элементов списка K |
Указатели на элементы списка |
… |
|
Рисунок 2.8 – Структура файла со списком на базе массива указателей после инициализации
Блок из первых 4 байт - условно запись №0, зарезервирован под заголовок списка дыр. Второй блок из 4 байт - условно запись №1, зарезервирован под указатель на массив указателей на элементы списка.
Массив указателей на элементы списка первоначально располагается, начиная с байта №8, и занимают блок байт размером 2*4 + N*4, где первые 2*4 байт занимают соответственно поле размер массива указателей - максимально возможное количество элементов списка N, и поле количество элементов списка К.
В последующем, при необходимости увеличения размера массива указателей, место для нового массива отводится уже в конце файла и выполняется корректировка указателя на массив указателей на элементы списка.
Обобщенная структура массива указателей имеет вид – Рисунок 2.9:
|
|
Индекс |
|
|
N+1 |
|
Незанятая часть массива |
… |
|
|
K+2 |
|
Указатель K -> |
K+1 |
|
. . . |
|
|
Указатель 2 -> |
+3 |
|
Указатель 1 -> |
+2 |
|
Количество элементов в списке K |
+1 |
PtrBase -> |
Размер массива N |
0 |
Рисунок 2.9 – Структура массива указателей, содержащего служебную информацию
где PtrBase - указатель на начало модифицированного массива указателей.
Однако при таком решении приходится специально следить за правильностью обработки начальных элементов массива – элементы с индексами 0 и 1, и остальных элементов массива – элементы с индексами от 2 до N-1. Это влечет усложнение текста соответствующих функций.
Во избежание отмеченного усложнения можно предложить ввести другой, назовем его действующий указатель PtrV, который будет ссылаться не на начало массива указателей, а на местоположение в этом массиве первого указателя на элемент списка. Именно действующий указатель будет заноситься в область файла, содержащую указатель на массив указателей на элементы списка.
Обобщенная структура массива указателей теперь будет имеет вид:
|
|
Индекс |
|
|
N+2 |
|
Незанятая часть массива |
|
|
|
K |
|
Указатель K -> |
K-1 |
|
|
|
|
Указатель 2 -> |
+1 |
PtrV -> |
Указатель 1 -> |
0 |
|
Количество элементов в списке K |
-1 |
PtrBase -> |
Размер массива М |
-2 |
Рисунок 2.10 – Структура массива указателей, содержащего служебную информацию и с индексацией указателей начиная с нуля
Теперь можно считать, что указатель на первый элемент списка имеет индекс 0, а элементы служебной информации имеют отрицательные значения индексов: ‑1 и –2.
В результате работа с указателями на элементы списка ничем не отличается от ранее рассмотренного случая, когда массив указателей содержал только сами указатели и не содержал никакой служебной информации.
Отличие будет только в работе с элементами служебной информации списка. Изменения коснутся следующих функций:
инициализация файла со списком;
открытие файла со списком;
корректировка счетчика элементов списка;
увеличение размера массива указателей на элементы списка;
удаление списка с усечением файла;
добавление элемента в список;
удаление элемента из списка;
поиск элемента.
Рассмотрим пример работы со списком в файле для случая, когда в файле может располагаться не один список, а несколько. В таком случае не удобно (а иногда и не возможно) использовать глобальные переменные, содержащие количество элементов списка CntElmLst и текущий размер массива SizeAr, значение которых инициализировались при открытии файла, потому что для каждого списка эти переменные имеют разные значения. Теперь в самих функциях работы со списком из массива указателей будут извлекаться значения количества элементов списка и размер массива указателей.
