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

2.1.28Функция удаления списка с усечением файла

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

void DelListAndTruncFile (char *FileName,TFile &f, int &Start_Hole, int &Start_list, int SizeArH)

{

/*В файле зарезервированы 16 + (SizeArrH+1)*4 байт*/

/*Условно первые 16-ть байт это четыре записи с номерами №0, №1, №2 и

№3, а последующие (SizeArrH+1)*4 байт это пространство для массива указателей на элементы списка*/

/*Запись №0 (4 байта) - заголовок списка дыр*/

/*Запись №1 (4 байта) – указатель на массив указателей на элементы списка*/

//Запись №2 (4 байта) – текущий размер массива указателей на элементы списка

/*Запись №3 (4 байта) – реальное количество элементов списка*/

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

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

/*Открытие файла в режиме записи. Файл становится пустым*/

f = fopen(FileName, "wb");

/*Формируется запись файла №0 */

fseek (f, 0, SEEK_SET);

Start_Hole = -2; /*признак пустого списка дыр*/

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

/*Формируется запись файла №1*/

Start_list = 16; //позиция 1-го байта массива указателей на элементы списка

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

/*Формируется запись файла №3*/

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

/*Формируется запись файла №4*/

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

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

/*Формируются начальные значения элементов массива

указателей на элементы списка объемом в SizeArrH+1*/

PtrElmLst = -1;

for (int J = 0; J<=SizeArH; J++)

{

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

}

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

fclose(f);

f = fopen(FileName, "r+b");

} /*DelListAndTruncFile*/

3Мультисписковые структуры

3.1Назначение мультисписков

Мультисписки [11] применяются в тех случаях, когда несколько линейных списковых структур необходимо объединить в одну взаимосвязанную структуру.

Будем различать верхний уровень мультисписка и другие – вложенные уровни мультисписка. Списки, расположенные на вложенных уровнях мультисписка, будем называть подсписками. Например, структура министерства образования, которая включает список входящих в это министерство высших учебных заведений, и соответствующие подсписки – списки факультетов, кафедр факультетов и преподавателей кафедр может быть представлена мультисписком иерархического типа. Ниже приводится графическое (абстрактное) представление такого мультисписка. Указатель начала мультисписка PBML ссылается на первый ВУЗ в списке ВУЗов.

КГУ

nil

КПИ

ЛГУ

ЛПИ

ХПИ

nil

P BML

ФИВТ

ФПМ

ФЭТ

ЭТФ

nil

АТ

ВТ

ТК

nil

Иванов

Петров

nil

Риснок 3.1 – Структура мультисписка иерархического типа «Министерство образования»

Можно предложить несколько способов реализации мультисписка в файловой структуре. Один из наиболее интуитивно понятных способов состоит в следующем.