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

Лабораторная работа № 6 Реализация списка в двоичном файле

СОДЕРЖАНИЕ

1.1.1 Инициализация списка 5

1.1.2 Вывод списка на экран 6

1.1.3 Поиск физического места для размещения нового элемента в файле 6

1.1.4 Освобождение физического места в файле после удаления элемента из списка 7

1.1.5 Добавление нового элемента в отсортированный список 8

1.1.6 Поиск элемента в отсортированном списке 9

1.1.7 Удаление элемента из отсортированного списка 10

1.1.8 Удаление списка 10

1.1.9 Задача, решаемая проектом 11

1.1.10 Интерфейс проекта 11

1.1.11 Описание типов для проекта 12

1.1.12 Реализации основного модуля проекта 13

Лабораторная работа № 6 Реализация линейного списка в двоичном файле.

Цели работы:

- Ознакомиться с особенностями создания и обработки списка в бинарном файле на С++;

  • Создать проект в системе Qt Creator, в котором реализованы основные операции обработки списка в двоичном файле.

    1. Теоретические сведения

Различные динамические структуры данных можно размещать не только в динамической памяти, но и в двоичных или текстовых файлах.

В данной лабораторной работе рассматривается размещение однонаправленного связанного списка в двоичном файле.

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

Реализация списка в файле имеет еще одну особенность – адрес первого элемента списка необходимо хранить в самом файле в отдельной записи файла, например в ее поле Next. Такая запись называется «заголовок списка» и всегда хранится в начале файла.

Поскольку поле Next не является указателем, то оно не может содержать значение NULL. В качестве признака того, что список пуст или элемент списка последний – используется значение -1 или любое другое значение меньше нуля, так как в двоичном файле записи нумеруются с нуля.

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

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

Следует отметить, что для учета свободных мест (записей) в файле и быстрого их поиска, «дыры» организованы в список.

Как список элементов, так и список дыр, должен иметь свой заголовок в начале файла.

Таким образом, при реализации списка в файле, в его начале расположен заголовок списка дыр и заголовок списка элементов.

Физическая структура данных для реализации списка в файле приведена на рисунке 6.1.

0

1

2

3

4

6

6

7

Загол.

списка

дыр

2

Загол.

списка

4

Дыра

3

Дыра

6

Арбуз

6

Бобер

7

Дыра

-1

Кеда

-1

Р исунок 6.1 – Физическая структура связанного списка в двоичном файле

Алгоритмы обработки списка в файле аналогичны алгоритмам по обработке списка в динамической памяти.

Для того чтобы представить разницу в обработке элемента списка, рассмотрим таблицу 6.1, где происходит изменение поля fam элемента списка, адрес которого содержится в переменной WP.

Таблица 6.1 – Сравнительная таблица, представляющая изменение поля текущего элемента списка при размещении его в куче и в файле.

Для кучи

Для файла

typedef

struct SStud{

char fam[30];

int bal;

SStud * next;

} TSStud;

TSStud *pStud;

//В тексте программы

. . .

pStud->bal = 200;

typedef

struct SStudF{

char fam[30];

int bal;

int Next;

} TSStudF;

FILE *fLst;

int wp;TSStudF stud;

//В тексте программы

. . .

fseek(fLst,wp,SEEK_SET);

fread(&stud,sizeof(TSStudF),1,fLst);

stud.bal = 200;

fseek(fLst,wp,SEEK_SET);

fwrite(&stud,sizeof(TSStudF),1,fLst);