Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по курсу.docx
Скачиваний:
107
Добавлен:
24.02.2016
Размер:
2.8 Mб
Скачать

17.1. Работа со списками

В практике программирования довольно часто встречается задача обра­ботки набора однотипных данных, количество которых меняется в зависимо­сти от ситуации. Их надо разместить в оперативной памяти и по мере надоб­ности с ними работать: добавлять новые данные в список, освобождаться от старых данных, находить нужную информацию. Показательным примером является задача обслуживания очереди заказов на покупку товара. Данные могут содержать информацию о заказчике: ФИО, адрес, финансовые возмож­ности и др. По мере появления новых заказчиков их дописывают в конец оче­реди, по мере поступления товара и обслуживания заказчиков из начала оче­реди данные об этих заказчиках стираются. При решении подобных задач программисты вводят понятие списка.

Список - это последовательность однотипных элементов (данных), с которыми надо работать в оперативной памяти: добавлять новые элементы в группу, удалять использованные, сортировать, находить нужные. В процессе работы список может возрастать и уменьшаться. Простейшая форма органи­зации списка - это массив данных. Данные, размещенные в массиве, имеют свой номер (индекс), что придает эффект «видимости» каждому элементу. Для организации работы со списками на основе динамического массива необ­ходимы процедуры добавления нового элемента в список на заданную пози­цию, удаление элемента с заданным номером, процедуры поиска и сортиров­ки. Две последние операции рассмотрены ранее.

17.2. Добавление нового элемента в список на заданную позицию

При добавлении нового элемента в список необходимо выделить па­мять, на один элемент большую существующей, затем скопировать старый список в новый раздел памяти, сдвинув элементы от заданной позиции до конца списка на одну позицию правее и добавить туда новый элемент.

Для организации добавления элемента avs в позицию nvs создадим следующую процедуру:

Type Tspis=integer; //Описание базового типа массива var a:array of Tspis;//Указатель на динамический массив

procedure addvec(avs:Tspis; nvs:integer); begin // Вставка avs на nvs-ю позицию setlength(a,high(a)+2); // Новая длина массива for k:=high(a)-1 downto nvs do a[k+1]:=a[k]; //Сдвиг a[nvs]:=avs; // Вставка

end;

Напомним, что при задании нового размера массива процедурой setlength() старые значения элементов массива сохраняются.

17.3. Удаления элемента с заданным номером

Процедура удаления элемента с номером nyd тоже требует, кроме вы­деления новой памяти и копирования, еще и «схлопывания», т.е. сдвига эле­ментов с nyd+1-го до конца списка на одну позицию влево, чтобы заполнить освободившуюся nyd-ю позицию. Процедура имеет вид;

procedure delvec(nyd:integer); begin

for k:=nyd+l to high(a) do a[k-l]:=a[k]; // Сдвиг setlength(a,high(a)); // Новая длина массива end;

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