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

2.1.7Функции корректировки указателя на начало списка, заголовка списка дыр, количества элементов списка и текщего размера массива указателей

Функция корректирует значение указателя начала списка .

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

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

{

fseek(f, 4, SEEK_SET);

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

} /*ChangeHeadElmList*/

Функция корректирует запись, содержащую размер массива указателей

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

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

{

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

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

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

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

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

} /*ChangeSizeAr*/

Функция корректирует запись, содержащую позицию первой дыры

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

позиции первой дыры в заголовочной записи файла*/

{

/*корректировка заголовка списка дыр*/

fseek (f, 0, SEEK_SET); /*позиционирование на поле, содержащее адрес

первой дыры */

fwrite (&HeadHole, sizeof (HeadHole),1, f ); /*занесение нового значения

заголовка списка дыр*/

} /*ChangeHeadHole*/

Функция корректирует запись, содержащую реальное количество элементов массива указателей.

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

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

{

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

fseek (f, 12, SEEK_SET); /*позиционирование на поле, содержащее

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

fwrite (&Cnt, sizeof (Cnt), 1, f); /*занесение нового значения количества

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

} /*ChangeCntElmList*/

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

Эта функция возвращает номер первого байта записи, выделенный под этот элемент списка.

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

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

int NewElem (TFile &f, int &HeadHole)

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

{

int FPos;

int NextHole; /* адрес следующей дыры*/

if (HeadHole == -2) /*выбор записи в конце файла*/

{

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

}

else /*выбор записи из головы списка дыр*/

{

FPos = HeadHole; /*позиция первой дыры*/

fseek (f, FPos, SEEK_SET);

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

/*корректировка указателя начала списка дыр*/

HeadHole = NextHole;

ChangeHeadHole(f, HeadHole);

fseek (f, FPos, SEEK_SET); /*позиционирование на дыру*/

}

return ftell(f); /*возвращаемая позиция нового элемента*/

} /*NewElem*/

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

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

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

void DisposeElList (TFile &f, int PosFreeElm, int &HeadHole) /*пополнение

списка дыр*/

{

/*корректировка заголовка списка "дыр"*/

/*формирование нового заголовка списка дыр*/

ChangeHeadHole(f, PosFreeElm);

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

fseek (f, PosFreeElm, SEEK_SET);

/*Записываем в новую дыру адрес бывшей первой дыры*/

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

} /*DisposeElList*/