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

2.1.22Процедура корректировки заголовка списка

Процедура в качестве параметра получает позицию, с которой располагается новый массив указателей в файле (позицию первого указателя в массиве указателей).

Процедура корректирует значение указателя начала списка в заголовке списка элементов.

void ChangeHeadElmList ( TFile &f, int Start_list) /*Уста-навливает новое значение

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

{

fseek(f, 4, SEEK_SET);

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

} /*ChangeHeadElmList*/

2.1.23 Процедура увеличения размера массива указателей на элементы списка

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

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

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

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

{

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

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

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

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

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

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

SizeW = SizeAr; /*Сохранение старого размера массива указателей*/

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

Start_listW = Start_list; /*сохранение указателя на старый массив*/

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

файла. Здесь будет располагаться новый массив указателей*/

fwrite(&SizeAr, sizeof(SizeAr), 1, f); /*записываем новый размер массива*/

fwrite(&CntElmLst, sizeof(CntElmLst), 1, f); /*записываем значение

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

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<=SizeAr; J++)

{

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

}

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

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

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

} /*ExpendArrPtr*/