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

2.1.26Функция добавления нового элемента в отсортированный список

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

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

Cчетчик количества элементов списка CountElmList увеличивается на 1.

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

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

void AddElmToSortList (TFile &f, int &Start_list, int PosNewEl, int Delta)

/*функция позволяет добавление дубликатов*/

{

int SizeAr; /*размер массива указателей*/

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

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

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

int IndPtrAddEl; /*индекс вставки указателя нового

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

bool FindOK;

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

где хранится текущий размер массива указателей*/

fread(&SizeAr, sizeof(SizeAr), 1, f); /*считывание размера массива

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

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

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

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

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

if (CntElmLst == SizeAr + 1)

{

/*Если массив переполнен, то расширение массива*/

ExpendArrPtr (f, Start_list, SizeAr, CntElmLst, Delta); /*увеличение

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

}

/*Считывание нового элемента чтобы сформировать ключ поиска*/

fseek (f, PosNewEl, SEEK_SET);

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

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

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

FindOK = FindElSortList2 (f,Start_list, WElmLst.Name, IndPtrAddEl);

/*смещение части содержимого массива указателей выше места

вставки указателя на добавляемый элемент на одну позицию

вправо, начиная с последнего єлемента*/

for (int K = CntElmLst-1; K >= IndPtrAddEl; K--)

{ /*Читаем К-й элемент в массиве указателей и сдвигаем его на к+1 - й*/

fseek (f, Start_list+K*sizeof(PtrElmLst), SEEK_SET);

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

fseek (f, Start_list + (K+1)*sizeof(PtrElmLst), SEEK_SET);

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

}

fseek (f, Start_list+IndPtrAddEl*sizeof(PtrElmLst), SEEK_SET);

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

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

CntElmLst++;

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

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

fwrite(&CntElmLst, sizeof(CntElmLst), 1, f); /*запись в файл нового

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

} /*AddElmToSortList*/