- •Лабораторная работа № 6 Реализация списка в двоичном файле
- •Лабораторная работа № 6 Реализация линейного списка в двоичном файле.
- •Теоретические сведения
- •Описание типов для списка, размещаемого в двоичном файле
- •Основные процедуры для реализации списка в двоичном файле
- •Вывод списка на экран;
- •Открытие файла для списка
- •1.1.3Поиск физического места для размещения нового элемента в файле
- •1.1.1Инициализация списка
- •1.1.2Вывод списка на экран
- •1.1.4Освобождение физического места в файле после удаления элемента из списка
- •1.1.5Добавление нового элемента в отсортированный список
- •1.1.6Поиск элемента в отсортированном списке
- •1.1.7Удаление элемента из отсортированного списка
- •1.1.12Реализации основного модуля проекта
- •Задания для выполнения проекта
- •Тестирование проекта
- •Содержание отчета
- •Контрольные вопросы и задания
1.1.4Освобождение физического места в файле после удаления элемента из списка
Назначение этой процедуры сходно с назначением процедуры delete для кучи.
В результате удаления элемента из списка остается запись в файле, которая не входит теперь в список элементов и еще не включена в список дыр. Процедура вставляет новую дыру (номер записи которой приходит в процедуру) в начало списка дыр. В результате изменяется поле Next заголовочной записи. Кроме позиции новой дыры, процедура получает как параметр файловую переменную.
Процедура освобождения физического места в файле после удаления элемента из списка представлена на рисунке 6.7.
//Функция освобождения места в файле после удаления элемента из списка //Параметры:файловая переменная f,позиция удаляемого элемента delPos void deleteFromFile(FILE *&f,int delPos) {TSStudF stud; // читаем заголовок списка дыр из файла rewind(f); fread(&stud,sizeof(TSStudF),1,f); // в прочитанном заголовке в поле Next находится адрес первой дыры // теперь эта дыра будет второй, значит то, что записано в поле Next // заголовочной записи, записываем в поле next новой дыры, теперь она // первая. Надписываем не отдельно значение поля Next, а полностью //запись, так как информация в дырах для нас не важна fseek(f,delPos,SEEK_SET); fwrite(&stud,sizeof(TSStudF),1,f); // Изменяем поле Next заголовочной записи, теперь в нем адрес вновь //добавленной дыры stud.Next=delPos; rewind(f); fwrite(&stud,sizeof(TSStudF),1,f); } |
Рисунок 6.7 – Процедура освобождения физического места в файле после удаления элемента из списка
1.1.5Добавление нового элемента в отсортированный список
Алгоритм процедуры добавления нового элемента в отсортированный список в файле аналогичен алгоритму такой процедуры для «кучи». Отличия возникают только из-за особенностей обращения к записям файла.
До вызова данной процедуры новый элемент должен быть уже записан в файл, его поле Next должно содержать значение -1.
Процедура добавления элемента в отсортированный список имеет следующие параметры:
Файловая переменная (по ссылке - всегда);
Адрес первого элемента списка (номер записи) (по ссылке, так как он может измениться при вставке элемента в начало списка);
Позиция (номер записи), в которой записан новый элемент в файле (по значению).
Процедура добавления нового элемента в упорядоченный список представлена на рисунке 6.8.
//Функция добавления нового элемента в упорядоченный список в файле //Параметры:файловая переменная f,St - смещение(адрес) первого элемента списка, //позиция записи нового элемента в файл newPos void addToSortList(FILE *&f,int &St,int newPos) {TSStudF stud,studNew; int pp,wp; // читаем новый элемент, нам понадобится его ключевое поле fseek(f,newPos,SEEK_SET); fread(&studNew,sizeof(TSStudF),1,f); // инициализация рабочих указателей wp=St; pp=-1; // цикл для поиска места вставки нового элемента while (wp!=-1) { fseek(f,wp,SEEK_SET); fread(&stud,sizeof(TSStudF),1,f); //читаем текущий элемент списка if (strcmp(studNew.fam, stud.fam)<=0) break;// если нашли место вставки, то выход из цикла pp=wp; // иначе переходим к следующему элементу wp=stud.Next; }; // После цикла wp и pp содержат адреса элементов, // между которыми необходимо вставить новый в списке // в поле Next нового элемента //заносим wp - адрес следующего и перезаписываем // новый элемент обратно в файл studNew.Next=wp; fseek(f,newPos,SEEK_SET); fwrite(&studNew,sizeof(TSStudF),1,f); // проверяем - новый элемент будет первым в списке // или нет if (pp==-1) St=newPos; // если первый, то начало списка St будет содержать его адрес else { // если не первый, то у предыдущего // элемента в поле Next заносим //адрес нового fseek(f,pp,SEEK_SET); fread(&stud,sizeof(TSStudF),1,f); stud.Next=newPos; fseek(f,pp,SEEK_SET);// после изменения поля Next у // предыдущего элемента, его необходимо // перезаписать обратно в файл fwrite(&stud,sizeof(TSStudF),1,f); }; } |
Рисунок 6.8 – Процедура добавления нового элемента в упорядоченный список в файле
