- •Содержание
- •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.3Статические и динамические массивы указателей
В статических массивах указателей заранее резервируется место для максимального количества указателей на элементы списка.
В динамических массивах указателей заранее резервируется место для начального количества указателей на элементы списка.
По мере необходимости объем динамического массива указателей увеличивается и ему выделяется новое место в файле. Содержимое старого массива указателей переписывается в новый массив указателей. Соответственно корректируется значение указателя на массив указателей. Место, которое занимал старый массив указателей, образует дыру, размер которой, в общем случае, не совпадает с размером дыры, образующейся в результате удаления элемента списка. В простейшем случае этой дырой можно пренебречь, однако возможно и более эффективное ее использование.
Наиболее типичным решением является выделение под динамический массив указателей нового места в конце файла. Возможно и другое, более экономное по расходу памяти, решение, которое приводится в следующем разделе.
Независимо от типа массива указателей – статический или динамический, первый элемент массива указателей имеет индекс 0, а последний – индекс SizeArrH. Таким образом, количества указателей на элементы списка в массиве равно SizeArrH+1.
Место для элементов списка в файле выделяется или освобождается по мере необходимости.
Действительное количество элементов списка определяется переменной CountElmList. Первоначально CountElmList равно 0. После добавления очередного элемента CountElmList увеличивается на 1, а после удаления очередного элемента CountElmList уменьшается на 1. Причем CountElmList всегда меньше или равно SizeArrH+1 - максимальному размеру массива указателей.
Примечание. Для удобства изложения ниже используются содержательно эквивалентные понятия – позиция элемента в массиве указателей и позиция первого байта соответствующего элемента, в соответствии с тем, что каждый элемент массива указателей занимает четыре байта.
Для дальнейшего изложения используем следующие типы данных и переменные:
const SizeArH=20; /*верхний индекс массива указателей*/
const Delta=20; /*приращение - величина, на которую увеличивается
размер массива указателей*/
typedef struct ElmList
{
char Name[30];
int Age;
char Address[30];
} TRecListFile;
typedef int TElmArrPtrFile; /*тип элемента массива указателей*/
typedef FILE* TFList;
TFList FList;
TRecListFile ElList;
int StartArrPtrElmList; /*начало массива указателей на элементы списка*/
int StartHole; /*начало списка дыр*/
int StartCountElmList; /*позиция первого байта записи, содер-
жащей действительное количество элементов в списке*/
int CountElmList; /*действительное количество элементов в списке*/
int PosPtrElmList; /*позиция указателя на найденный элемент списка в
массиве указателей*/
TElmArrPtrFile PosFindElm; /*позиция найденного элемента списка в файле*/
char* FindKey;
int Portion;
bool FindOK;
char* DelKey;
Обращение к массиву указателей на элементы списка выглядит следующим образом:
fseek(FList, 4, SEEK_SET); /*позиционирование курсора файла на указатель на массив указателей*/
fread(&StartArrPtrElmList, 4, 1, FList ); /*считывание позиции первого байта массива указателей – начала массива указателей*/
Здесь сначала выполняется позиционирование на 4-ый байт файла - 1‑ый байт указателя на массив указателей на элементы списка. Затем считывается позиция начала массива указателей - позиция 1‑го байта массива указателей на элементы списка StartArrPtrElmList.
Обращение к элементу массива указателей на элементы списка. Пусть, например, необходимо получить доступ к элементу массива с индексом 5-ть. Это выглядит следующим образом:
PosPtrElmList = StartArrPtrElmList + (5-1) * sizeof(TElmArrPtrFile);
fseek(FList, PosPtrElmList, SEEK_SET); /*позиционирование курсора файла
на указатель с индексом 5 в массиве указателей*/
Portion = sizeof(PosFindElm);
fread(&PosFindElm ,Portion ,1 ,FList); /*считывание указателя на элемент
списка с индексом 5-ть*/
Здесь сначала определяется PosPtrElmList - позиция в файле первого байта указателя на 5-ый элемент списка. Затем выполняется позиционирование на 1-ый байт этого указателя. После чего выполняется считывание указателя PosFindElm на элемент списка с индексом 5.
Обращение к элементу списка. Пусть, например, необходимо получить доступ к элементу списка с индексом 5-ть. Это выглядит следующим образом:
fseek(FList, PosFindElm, SEEK_SET); /*позиционирование на первый байт
элемента списка с индексом 5 */
Portion = sizeof(ElList);
fread(&ElList, Portion, 1, FList); /*чтение элемента списка с индексом 5*/
Здесь сначала с помощью указателя PosFindElm выполняется доступ к первому байту искомого элемента списка. После чего выполняется чтение этого элемента в переменную ElList.
Обращение к конкретному полю элемента списка. Пусть переменной X необходимо присвоить содержимое поля Age 5‑го элемента списка. С учетом всех предыдущих действий это выполняется следующим образом:
int X = ElList.Age;
Пусть полю Age 5‑го элемента списка необходимо присвоить некоторое значение. С учетом всех предыдущих действий это выполняется следующим образом:
ElList.Age = 19;
fseek(FList, PosFindElm, SEEK_SET);/*позиционирование на первый байт
элемента списка с индексом 5*/
Portion = sizeof(ElList);
fwrite (&ElList, Portion, 1, FList); /*запись элемента списка с индексом 5*/
Здесь сначала изменяется значение поля Age записи ElList. Затем с помощью указателя PosFindElm выполняется доступ к первому байту искомого элемента списка, после чего содержимое записи ElList заносится в нужное место файла.
