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

2.1.10 Функция увеличения размера массива указателей на элементы списка

Количество элементов массива определяется переменной SizeArr. Первоначально под массив указателей выделяется объем памяти, необходимый для хранения элементов массива, количество которых равно значению SizeArrH+1. В последующем значение переменной SizeArr может увеличиваться.

Действительное количество элементов списка определяется переменной CountElmLst.

Если при добавлении очередного элемента списка обнаружится, что емкость списка исчерпана, происходит наращивание емкости массива на величину Delta. При этом сначала резервируется память для размещения расширенного массива указателей, затем в новый массив копируется содержимое старого массива указателей, а занимаемое им место становится дырой.

void ExpendArrPtr(TFile &f, int &Start_list, int &SizeAr, int CntElmList, int Delta)

{

/*Увеличение размера массива указателей*/

int SizeW; /*переменная для хранения старого размера масси-

ва указателей*/

int Start_listW; /*переменная для хранения позиции начала старого

массива указателей в файле*/

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

SizeW = SizeAr; /*сохранение старого размера массива*/

SizeAr = SizeAr + Delta; /*определение нового размера массива*/

Start_listW = Start_list; /*сохранение позиции расположения старого

массива*/

fseek(f,0,SEEK_END); /*позиционирование файлового курсора в

конец файла*/

Start_list = ftell(f); /*позиция 1-го байта нового массива указателей

в конце файла*/

/*копирование старого массива указателей в новый массив*/

for (int J = 0; J <= CntElmLst - 1; J++)

{

fseek (f, Start_listW, SEEK_SET); /*позиционирование на теку-

щий указатель старого мас-

сива указателей*/

fread (&PtrElmLst, sizeof(PtrElmLst), 1, f); /*чтение текущего указателя*/

fseek (f, 0, SEEK_END); /*позиционирование на конец файла*/

fwrite (&PtrElmLst, sizeof(PtrElmLst), 1, f); /*занесение текущего

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

Start_listW = Start_listW + 4; /*переход к следующему указателю

старого массива указателей*/

}

/*расширение нового массива указателей до объема в SizeArr+1*/

PtrElmLst = -1;

for (J = CntElmLst; J <= SizeArr; J++)

{

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

}

/*корректировка поля размер массива указателей*/

ChangeSizeAr(f,SizeArr);

/*корректировка поля указателя на массив указателей*/

ChangeHeadElmList(f, Start_list); /*занесение адреса начала нового массива

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

/*Внимание! Старый массив указателей образовал дыру*/

} /*ExpendArrPtr*/

2.1.11 Функция вывода содержимого списка

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

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

void PrintListInListView (TFile &f, int Start_list, int CntElmList, System::

Windows::Forms::ListView * listView)

{

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

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

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

listView->Items->Clear();

if (CntElmList == 0) return;

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

с индексом 0*/

for( int i=0; i < CntElmList; 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*/