- •Содержание
- •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.5Функция инициализации файла со списком
Эта процедура выполняется только один раз для каждого списка. Она осуществляет формирование в файле содержимого записей №0, №1, №2 и №3, а также начального содержимого SizeArrH+1 элементов массива указателей на элементы списка.
Запись №0 содержит заголовок списка дыр. В качестве признака последнего элемента этого списка используется значение –2 в поле следующая дыра соответствующей дыры. При инициализации файла список дыр пуст. Следовательно, в начальный момент содержимое записи №0 равно –2.
Запись №1 содержит адрес первого байта массива указателей на элементы списка. В случае статических массивов это значение постоянно и равно 16.
Запись №2 содержит размер массива указателей на элементы списка. В начальный момент содержимое этой записи равно SizeArrH.
Запись №3 содержит значение счетчика элементов списка. В начальный момент содержимое этой записи равно 0.
SizeArrH+1 записей, предназначенных для указателей на элементы списка, в начальный момент содержат значение –1, признак "нулевого" значения указателя.
// --------- Инициализация файла ----------//
bool initFile (char *FileName, TFile &f )
/*выполняется только один раз при создании файла со списком*/
/*Функция возвращает false если произошла ошибка открытия файла*/
/* FileName – имя файла */
/* f – файловый указатель */
{
/*открытие файла для записи*/
if (( f = fopen ( FileName, "wb" )) == NULL)
{
/* произошла ошибка открытия файла*/
return false;
}
int Head_Hole; /*указатель на голову списка дыр*/
int StArrPtrElmList; /*позиция 1-го байта массива указателей на
элементы списка */
int CntElmList; /*количество элементов списка*/
TElmArrPtrFile PtrElmLst; /*указатель на элемент списка*/
/*Формируется запись файла №0 */
fseek (FList, 0, SEEK_SET); /*только для иллюстрации. В действительности
курсор файла уже находится в позиции 0*/
HeadHole = -2; /*признак пустого списка дыр*/
fwrite(&HeadHole, sizeof(HeadHole), 1, f);
/*Формируется запись файла №1*/
fseek (FList, 4, SEEK_SET); /*только для иллюстрации. В действительности
курсор файла уже находится в позиции 4*/
tArrPtrElmList = 16; /*позиция 1-го байта массива указателей на
элементы списка*/
fwrite ( &StArrPtrElmList , sizeof (StArrPtrElmList), 1, f);
/*Формируется запись файла №2*/
fseek (FList, 8, SEEK_SET); /*только для иллюстрации. В действительности
курсор файла уже находится в позиции 8*/
fwrite ( &SizeArH, sizeof(SizeArH), 1, f );
/*Формируется запись файла №3*/
fseek (FList, 12, SEEK_SET); /*только для иллюстрации. В действительности
курсор файла уже находится в позиции 12)*/
CntElmList = 0; /*начальное количество элементов списка*/
fwrite(&CntElmList , sizeof(CntElmList), 1, f);
/*Формируются начальные значения элементов массива указателей на элементы списка объемом в SizeArrH+1*/
PtrElmLst =- 1;
for ( int k = 0; k <= SizeArH; k++ )
{
fwrite (&PtrElmLst , sizeof (PtrElmLst), 1, f);
}
fclose(f);
return true;
}
2.1.6Функция открытия файла со списком
Эта функция выполняется каждый раз при очередном запуске программы обработки списка. В качестве параметров она получает имя файла и возвращает позицию первого байта записи, содержащей первую дыру, позицию первого байта массива указателей на элементы списка, размер массива указателей и реальное количество элементов списка.
bool OpenFileList(char * FileName, TFile &f, int &StHole, int &Start_list,
int &SizeAr, int &CntElmList)
/* Открывает существующий файл и возвращает false если произошла ошибка открытия файла*/
{ /*открытие файла для чтения и записи*/
if ((f = fopen(FileName, "r + b")) == NULL)
{
/*произошла ошибка открытия файла*/
return false;
}
/*чтение заголовка списка дыр StHole*/
fseek(f, 0, SEEK_SET); /*только для иллюстрации. В действительности
курсор файла уже находится в позиции 0*/
fread(&StHole, sizeof(StHole), 1, f);
/*чтение адреса первого байта массива указателей на элементы списка Start_list*/
fseek(f, 4, SEEK_SET); /*только для иллюстрации. В действительности
курсор файла уже находится в позиции 4*/
fread(&Start_list, sizeof(Start_list), 1, f);
/*чтение размера массива указателей SizeAr*/
fseek(f, 8, SEEK_SET); /*только для иллюстрации. В действительности
курсор файла уже находится в позиции 8*/
fread(&SizeAr, sizeof(SizeAr), 1, f);
/*чтение счетчика реальных элементов списка CntElmList */
fseek(f, 12, SEEK_SET); /*только для иллюстрации. В действительно-
сти курсор файла уже находится в позиции 12*/
fread(&CntElmList, sizeof(CntElmList), 1, f);
return true;
} /*OpenFileList*/
