- •Содержание
- •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Приложения
1.1.2Статические массивы указателей
В статических массивах указателей резервируется место для максимального количества указателей на элементы списка SizeArrH+1, а место для элементов списка выделять или освобождать в динамической памяти по мере необходимости.
Количество элементов списка определяется переменной Count. Первоначально Count равно 0. После добавления очередного элемента Count увеличивается на 1. Для дальнейшего изложения используем следующие типы данных и переменные:
const int SizeArrH = 20; /*верхняя граница массива указателей*/
typedef struct ElmList
{
char Name[30];
int Age;
char Address[30];
} TElmList; /*тип для элемента списка */
TElmLis* Ar [SizeArrH]; /*Объявление массива указателей на
элементы списка*/
Массив указателей размещается в статической памяти. Здесь SizeArrH задает верхнюю границу массива, а Count - реальное количество элементов в массиве или, что тоже, количество элементов в списке. Причем Count всегда меньше или равно SizeArrH+1. Таким образом, максимальное количество элементов в списке равно SizeArrH+1. Переменная J соответствует индексу текущего элемента массива или, что тоже, соответствующему элементу списка, причем J всегда меньше или равно Count.
Обращение к элементу массива указателей на элементы списка. Пусть, например, необходимо получить доступ к элементу массива с индексом 5. Это выглядит следующим образом:
Arr [5]
Здесь сначала с помощью имени Arr выполняется доступ к первому элементу массива указателей на элементы списка. Затем выполняется доступ к элементу массива указателей с индексом 5.
Обращение к элементу списка. Пусть, например, необходимо получить доступ к элементу списка с индексом 5. Это выглядит следующим образом:
Примечание: Оператор [ ] имеют больший приоритет, чем оператор разыменования указателя *, поэтому, сначала будет взят элемент массива с индексом 5, а затем к нему будет применяться оператор разыменования указателя.
* Arr [5]
Здесь сначала с помощью имени Arr выполняется доступ к первому элементу массива указателей на элементы списка. Затем выполняется доступ к элементу массива указателей с индексом 5, после чего выполняется доступ к первому байту элемента списка с индексом 5.
Обращение к конкретному полю элемента списка. Для того, чтобы обратиться к полю (элементу) структуры через указатель, используется оператор ссылки на поле структуры->. Обращение к полю Name пятого элемента списка будет иметь вид:
Arr [5] -> Name
Это значение эквивалентно значению выражения :
(* Arr [5] ) . Name
Общий вид обращения к полю структуры можно записать так:
Структура . поле (1)
Указатель на структуру -> поле (2)
или так
(*указатель на структуру) . поле (3)
Поскольку в данном курсовом проекте используются указатели на структуры, то чаще всего будет использоваться обращение к полю вида (2).
Для работы с указателями используется ряд операторов таблицы 1.1:
Таблица 1.1- Операторы С++ для работы с указателями
-
*указатель
Оператор разыменования указателя. Возвращает значение, хранящееся по указанному адресу
&операнд
Оператор получения адреса. Возвращает адрес своего операнда
указатель->поле структуры
Оператор ссылки на поле структуры. Позволяет получить доступ к полю структуры, адрес которой содержит указатель.
(тип) выражение
Приведение типов. Значение выражения преобразуется в значение типа тип.
sizeof(тип или переменная)
Вычисляет длину операнда в байтах.
[ ]
Индексация массива
( )
Повышение приоритета операций, заключенных внутри скобок
Примечание. Во избежание множества ошибок при работе с данными в динамической памяти очень важно знать приоритеты этих операторов – см. Таблица 1.2.
Таблица 1.2 – Приоритеты операторов в С++:
-
Высший
( ) [ ] ->
Низший
(тип) & sizeof *
Пусть полю Name элемента списка с индексом 5 необходимо присвоить некоторое значение. Это выполняется следующим образом:
strcpy( Arr [5] -> Name, "Иванов" );
и, наоборот,
char x[30]="";
strcpy( x , Arr [5] -> Name);
Здесь сначала с помощью имени Arr выполняется доступ к первому элементу массива указателей на элементы списка. Затем выполняется доступ к элементу массива указателей с индексом 5, после чего выполняется доступ к первому полю элемента списка с индексом 5.
На много проще эта оперция выполняется с числовыми полями. Для того, чтобы в поле Age элемента списка с индексом 5 занести значение 18 необходимо сделать следующее:
Arr [5] -> Age = 18
и, наоборот,
int n = Arr [5] -> Age;
