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

2.1.24Функция поиска элемента списка или позиции вставки нового элемента методом половинного деления

bool FindElSortList2 (TFile &f, int Start_list, char* Key, int &PosFndEl)

/*поиск выполняется методом половинного деления*/

/*процедура имеет двойное назначение - поиск месторасположения искомого элемента и поиск места вставки добавляемого элемента*/

{

int CntElmLst; /*количество элементов списка*/

int Middl; /*Middl выступает как средняяграница обрабатываемой

части массива*/

int Hi, Low; /*текущие границы – верхняя и нижняя,

обрабатываемой части массива */

TElmArrPtrFile PtrElmLst; /*указатель на элемент списка*/

TRecListFile WElmLst ; /*текущий элемент списка*/

bool FindOK = false; /*элемент не найден*/

fseek(f, Start_list - 4, SEEK_SET); /*ставим курсор файла в позицию,

где хранится количество элементов списка*/

fread(&CntElmLst, sizeof(CntElmLst), 1, f); /*считывание количества

элементов списка */

if (CntElmLst == 0)

{

/*список пуст. PosFndEl содержит индекс в массиве указателей

возможной вставки указателя на новый элемент*/

PosFndEl = 0;

return FindOK;

}

Low = 0;

Hi = CntElmLst-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: PosFndEl = Middl;

FindOK = true; /*элемент найден*/

return FindOK;

case 1: Hi = Middl - 1;

break;

case -1: Low = Middl + 1;

break;

}

}while (Low <= Hi);

PosFndEl = Low ; /*перебран весь массив. Искомый элемент не найден.

Определена позиция возможной вставки нового элемента*/

return FindOK;

} /*FindElSortList2*/

2.1.25Функция вывода списка на экран

Функция выводит содержимое списка на экран в компонент ListView. Она получает позицию первого байта массива указателей и указатель на объект ListView.

Количество элементов списка считывается из служебного поля массива указателей.

void PrintListInListView(TFile &f, int &Start_list, System:: Windows:: Forms:: ListView * listView)

{

int PosPtrElmLst; /*позиция указателя в массиве указателей*/

int CntElmLst; /*количество элементов списка*/

TElmArrPtrFile PtrElmLst; /*указатель на элемент списка*/

TRecListFile WElmLst; /*текущий элемент списка*/

listView->Items->Clear();

fseek(f, Start_list - 4, SEEK_SET); /*ставим курсор файла в позицию,

где хранится количество элементов списка*/

fread(&CntElmLst, sizeof(CntElmLst), 1, f); /*считывание количества

элементов списка */

if (CntElmLst == 0) return;

PosPtrElmLst = Start_list; /*позиция указателя на элемент списка с ин-

дексом 0*/

for(int I = 0; I < CntElmLst; i++)

{

/*чтение очередного указателя*/

fseek(f, PosPtrElmLst, SEEK_SET );

fread (&PtrElmLst, sizeof(PtrElmLst), 1 ,f);

/*чтение очередного элемента списка*/

fseek (f, PtrElmLst, SEEK_SET );

fread (&WElmLst,sizeof(WElmLst), 1, f);

/*печать значений требуемых полей элемента списка*/

listView->Items->Add(WElmLst.Name);

listView->Items->Item[i]->SubItems->Add(WElmLst.Address);

/*позиция следующего указателя*/

PosPtrElmLst = PosPtrElmLst + sizeof(PtrElmLst);

}

} /*PrintListInListView*/