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

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.

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

  1. Файловая переменная (по ссылке - всегда);

  2. Адрес первого элемента списка (номер записи) (по ссылке, так как он может измениться при вставке элемента в начало списка);

  3. Позиция (номер записи), в которой записан новый элемент в файле (по значению).

Процедура добавления нового элемента в упорядоченный список представлена на рисунке 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 – Процедура добавления нового элемента в упорядоченный список в файле