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

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

Самым естественным является добавление элемента в конец списка, так как для этого необходимо занести новый указатель в элемент массива указателей с номером CountElmList. При этом необходимо следить за тем, чтобы не выйти за пределы массива.

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

void AddElEndList (TFile &f, int &Start_list, int &SizeAr, int &CntElmList,

int PosNewEl, int Delta)

{

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

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

if (CntElmList == SizeAr + 1)

{

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

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

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

}

PosPtrElmLst = Start_list + sizeof(PtrElmLst) * CntElmList;

fseek (f, PosPtrElmLst, SEEK_SET);

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

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

CntElmList ++;

ChangeCntElmList (f, CntElmList);

} /*AddElEndList*/

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

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

Здесь следует различать два случая – добавляемый элемент будет последним в списке, и добавляемый элемент будет не последним в списке.

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

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

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

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

void AddElmToSortList (TFile &f, int &Start_list, int &SizeAr, int &CntElmList,

int PosNewEl, int Delta)

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

{

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

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

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

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

bool FindOK;

if (CntElmList == SizeAr + 1)

{

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

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

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

}

/*формирование ключа поиска*/

fseek (f, PosNewEl, SEEK_SET);

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

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

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

FindOK = FindElSortList2 (f, Start_list, CntElmList, WElmLst.Name,

IndPtrAddEl);

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

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

for ( int K = CntElmList-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);

}

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

элемент с индексом IndPtrAddEl */

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

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

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

CntElmList++;

ChangeCntElmList (f , CntElmList);

} /*AddElmToSortList*/