Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
DSD_Spiskovye_struktury_dannykh_na_baze_massivo...doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.59 Mб
Скачать

5Совместное использование указателей на данные и указателей на функции

В этом разделе приводятся пять программ, в которых используются обобщенные - инвариантные функции обработки списков, настройка которых выполняется с помощью указателей на функции, передаваемые в качестве параметров этих функций.

Список строится на основе динамического массива указателей на элементы списка, расположенного в динамической памяти. Ниже приводятся только основные положения по организации списков на основе массивов указателей.

Элемент списка имеет вид:

typedef

struct ElmList

{

char Name[30];

int Age;

char Address[30];

} TElmList;

В приводимых ниже примерах для обработки списка, помимо других функций, используются две обобщенные, настраиваемые на конкретный режим работы, функции:

  • BubbleSortList;

  • FindElSortList.

Эти функции настраиваются на требуемый режим работы путем передачи им в качестве параметров указателей на конкретные функции, реализующие различные варианты сравнения:

  • CompTwoElmOnName

  • CompTwoElmOnAddress

  • CompNameAndKey

  • CompAddrAndKey.

5.1Инвариантные функци

В приводимых ниже примерах для обработки списка, помимо других функций, используются две инвариантные, настраиваемые на конкретный режим работы, функции – функциия сортировки списка по значению элементов некоторого поля и функция поиска элементов списка по ограничению на значение элементов некоторого поля:

  • BubbleSortList;

  • FindElSortList.

Структура этих функций является неизменной с точностью до имени и типа поля, по которому выполняется сортировка или поиск. Действительно, если обработка списка, например сортировка, должна выполняться по разным полям, допустим Name и Address , то потребуется соответствующее количество вариантов функции сортировки.

Естественным является желание реализовать указанные функции так, чтобы они не зависели от имени и типа поля, по которому выполняется обработка. То есть функции должны быть инвариантными к имени и типу поля, по котором выполняется обработка списка.

Для обеспечения инвариантности указанных функций к имени и типу поля, по которому выполняется обработка, вводятся вспомогательные функции сравнения. Например, к ним относится функция сравнения двух элементов списка по полю Name, и функция сравнения элемента списка по полю Name и ключу.

Любая из функций сравнения возвращает одно из трех значений в диапазоне {–1, 0, 1}. Конкретное значение, возвращаемое функцией, зависит от результата сравнения значений первого и второго параметров функции – меньше, равно или больше. В результате такие функции локализуют в себе конкретные имена и типы полей, а возвращают одно из трех целочисленных значений, отражающих результат сравнения.

Инвариантные функции настраиваются на требуемый режим работы – тип и значение поля, путем передачи им в качестве параметров указателей на конкретные функции, реализующих различные варианты сравнения. Так как все функции сравнения возвращают значения из одного диапазона, то функции сортировки или поиска становятся независимыми от имени и типа обрабатываемых полей элементов списка.