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

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

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

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

Если удаляемый элемент оказывается не последним в списке и располагается на позиции J, то все указатели в массиве указателей, начиная с указателя в позиции J+1 и до CountElmList-1, смещаются на одну позицию вниз.

В обоих случаях счетчик количества элементов списка CountElmList уменьшается на 1, а удаляемый элемент заносится в список дыр.

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

Количество элементов списка оперделяется внутри функции путем смещения файлового курсора влево на 4 байта относительно позиции начала массива указателей и считывания значения в перемнную CntElmLst.

void DelElmSortList (TFile &f, int Start_list,char* DelKey, int &Head_Hole)

{

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

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

int IndPtrDelEl; /*индекс указателя на удаляемый

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

int PosDelEl; /*позиция удаляемого элемента в файле*/

bool FindOK;

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

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

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

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

if (CntElmLst == 0)

{ return;}

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

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

FindOK=FindElSortList2 (f, Start_list, DelKey, IndPtrDelEl);

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

if (!FindOK) /*Элемент не найден. Выход из функции*/

{return;}

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

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

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

fread (&PosDelEl, sizeof(PosDelEl), 1, f); /*чтение позиции удаляемого

элемента*/

DisposeElList (f, PosDelEl, Head_Hole); /*занесение удаляемого

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

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

мым и до последнего*/

for (int K = IndPtrDelEl + 1; K < CntElmLst; 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);

}

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

CntElmLst--;

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

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

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

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

} /*DelElmSortList*/