- •Содержание
- •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.12 Функция поиска элемента списка
Процесс поиска элемента в списке можно рассматривать независимо от вида списка – упорядоченный список или нет. В этом случае для поиска искомого элемента следует перебрать в среднем половину элементов списка. Однако для упорядоченных списков естественно применить более оптимальные методы поиска, например метод половинного деления.
Поиск элемента в упорядоченном списке. Пусть поиск выполняется по полю Name - ключ поиска. Функция поиска элемента списка по ключу возвращает IndFndEl - номер элемента в массиве, в котором содержится указатель найденного элемента, при FindOK = true, или индекс элемента массива, в котором может размещаться указатель на добавляемый элемент, если искомого элемента в списке нет, при FindOK = false. Ниже приводятся два варианта функции поиска – перебором элементов массива и методом половинного деления.
Функция поиска методом перебора в качестве параметров получает позицию 1-го байта массива указателей на элементы списка, реальное количество элементов списка, ключ поиска и возвращает индекс указателя найденного элемента (индекс возможной вставки указателя нового элемента) и возвращает признак – поиск успешен.
bool FindElSortList1 (TFile &f, int Start_list, int CntElmList, char* Key,
int &PosFndEl)
{
/*процедура имеет двойное назначение - поиск месторасположения искомого элемента и поиск места вставки добавляемого элемента*/
int PosPtrElmLst; /*позиция указателя в массиве указателей*/
TElmArrPtrFile PtrElmLst; /*указатель на элемент списка*/
TRecListFile WElmLst; /*текущий элемент списка*/
bool FindOk = false; /*элемент не найден*/
if (CntElmList == 0)
{
/*список пуст. PosFndEl содержит индекс в массиве возможной вставки указателя на новый элемент*/
PosFndEl = 0;
return FindOk;
}
PosPtrElmLst = Start_list; /*позиция указателя на элемент списка
с индексом 0*/
for ( int J = 0; J < CntElmList; J++)
{
/*чтение очередного указателя*/
fseek(f, PosPtrElmLst, SEEK_SET);
fread (&PtrElmLst, sizeof(PtrElmLst), 1, f);
/*чтение очередного элемента списка*/
fseek (f, PtrElmLst, SEEK_SET );
fread (&WElmLst, sizeof(WElmLst), 1, f);
/*сравнение поля Name элемента списка и Key*/
if (strcmp(WElmLst.Name, Key) >= 0)
{
PosFndEl = J; /*позиция указателя найденного или сле-
дующего большего элемента*/
if (strcmp(WElmLst.Name, Key) == 0)
{
FindOk = true; /*элемент найден. В противном случае PosFndEl
содержит позицию (в массиве указателей) возможной вставки нового элемента*/
}
return FindOk;
}
/*позиция следующего указателя*/
PosPtrElmLst = PosPtrElmLst + sizeof(PtrElmLst);
}
PosFndEl = CntElmList; /*перебран весь массив указателей. PosFndEl
содержит индекс (в массиве указателей) возможной вставки указателя на новый элемент*/
return FindOk;
} /*FindElSortList1*/
Функция поиска методом половинного деления в качестве параметров получает позицию 1-го байта массива указателей на элементы списка, реальное количество элементов списка, ключ поиска и возвращает указателя найденного элемента (индекс в массиве указателей возможной вставки указателя на новый элемент) и возвращает признак – поиск успешен.
bool FindElSortList2 (TFile &f, int Start_list, int CntElmList, char* Key,
int &IndFndEl)
/*поиск выполняется методом половинного деления*/
/*процедура имеет двойное назначение - поиск месторасположения искомого элемента и поиск места вставки добавляемого элемента*/
{
int Middl; /*Middl выступает как средняя граница обрабатываемой
части массива*/
int Hi, Low; /*текущие границы – верхняя и нижняя, обрабатываемой
части массива */
TElmArrPtrFile PtrElmLst; /*указатель на элемент списка*/
TRecListFile WElmLst ; /*текущий элемент списка*/
bool FindOK = false; /*элемент не найден*/
if (CntElmList == 0)
{
/*список пуст. IndFndEl содержит индекс в массиве указателей
возможной вставки указателя на новый элемент*/
IndFndEl = 0;
return FindOK;
}
Low = 0;
Hi = CntElmList-1;
do
{
Middl = (Hi + Low) / 2;
/*чтение указателя очередного среднего элемента*/
fseek (f, Start_list + Middl * sizeof(PtrElmLst), SEEK_SET);
fread (&PtrElmLst, sizeof(PtrElmLst), 1, f);
/*чтение очередного среднего элемента списка*/
fseek (f, PtrElmLst, SEEK_SET );
fread (&WElmLst, sizeof(WElmLst), 1, f);
/*сравнение поля Name элемента списка и Key*/
switch (strcmp(WElmLst.Name, Key))
{
case 0: IndFndEl = Middl;
FindOK = true; /*элемент найден*/
return FindOK;
case 1: Hi = Middl - 1;
break;
case -1: Low = Middl + 1;
break;
}
}while (Low <= Hi);
IndFndEl = Low ; /*перебран весь массив. Искомый элемент не
найден. Определен индекс возможной вставки нового элемента*/
return FindOK;
} /*FindElSortList2*/
