Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Stud_2_1 / Kurs_Rab / Metuk.doc
Скачиваний:
20
Добавлен:
03.03.2016
Размер:
523.78 Кб
Скачать

3. И с п о л ь з о в а н и е л и н е й н ы х с п и с к о в

Будем рассматривать приведенный выше пример по обработке личных карточек студентов.

В ряде режимов обработки требуется наличие в памяти ЭВМ одновременно всех личных карточек. Такая необходимость возникает, например, при группировке карточек по алфавиту фамилий студентов.

Решение рассматриваемой задачи может быть выполнено путем использования массива или линейного списка записей.

Дополним описание записи следующим фрагментом:

Const Nmax = 500; { максимальный размер массива Studs }

Type StudAr = array[1..Nmax] of StudType;

Var n : word; { текущий размер массива Studs }

Studs : StudAr; { массив личных карточек }

Здесь обрабатываемый архив документов представлен в памяти ЭВМ в виде массива Studs, каждый компонент которого - это запись типа StudType, имеющая длину 49 байт.

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

1. Массив всегда имеет фиксированный размер (в данном случае Nmax = 500), который не может быть изменен в процессе работы программы. Следовательно, при объявлении массива приходится ориентироваться на его максимально возможный размер, что ведет к неэкономному использованию памяти ЭВМ.

2. При изменении текущего количества компонентов в массиве (добавление новых или удаление существующих) обрабатываемый массив требуется полностъю или частично переместить в памяти ЭВМ (сдвигать влево или вправо компоненты массива). Это требует определенных затрат машинного времени, которые тем больше, чем длиннее поле памяти, занимаемое одним компонентом.

Указанные недостатки можно устранить, если для представления группы обрабатываемых документов использовать списковые структуры (стек, очередь и т.п.). Для списка может быть выделено ровно столько памяти, сколько требуется для размещения данной группы записей, причем эта память может быть выделена в любой момент работы программы и освобождена, когда в этом возникнет необходимость. При изменении количества компонентов в списке нет необходимости перемещать их в памяти; для этого достаточно изменить значения соответствующих указателей.

Тем не менее списковые структуры обладают и некоторыми недостатками по сравнению с массивами.

1. Компонент однонаправленного списка занимает на 4 байта больше памяти, чем компонент массива (за счет размещения в нем указателя).

2. Список не предоставляет возможность прямого доступа к его компонентам (например, чтение компонента по его номеру в списке). Это, в частности, исключает возможность применения метода двоичного поиска для нахождения в сгруппированном списке компонента с заданным кодом.

Сравнивая достоинства и недостатки списковых структур, можно сделать вывод, что для задач АУС, в которых объектами обработки в основном являются записи большого размера, списки более предпочтительны по сравнению с массивами.

При использовании линейного списка для представления архива записей необходимо выбрать один из двух простых типов списка: стек или очередь.

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

Type PointStud = ^DynStud;

DynStud = record

Inf : StudType;

Next : PointStud;

end;

Var LeftStud,RightStud,RunStud : PointStud;

Здесь Inf - информационная часть компонента очереди;

Next - указатель на следующий элемент;

LeftStud, RightStud, RunStud - соответственно левый, правый и текущий указатели очереди.

Соседние файлы в папке Kurs_Rab