Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Текст лекций.doc
Скачиваний:
2
Добавлен:
01.04.2025
Размер:
1.59 Mб
Скачать

12.3. Средства языка Паскаль для организации списков

Элемент списка создается для размещения в нем полезной информации (некоторых данных). Типы этих данных зависит от назначения списка, и могут быть какими угодно. В приводимых ниже примерах эта часть данных элемента списка будет иметь частный характер. Остальные части структуры элемента – переменные, используемые для организации списка, и их типы не зависят от назначения списка, то есть имеют не частный характер.

  • Структура элемента в Паскале описывается с помощью конструкции типа record.

  • Для связи элементов между собой используется тип «указатель на элемент».

  • В программе для связи со списком должны быть объявлены одна или несколько статических переменных-указателей на элемент списка. Это может быть голова списка (Head), конец списка (Tail) и другие.

В качестве примера приведем объявление типа элемента, информационная компонента которого задается полем Data типа TData.

Frame190

Для создания элемента списка как динамической переменной используют процедуру New:

Frame191

12.4. Типовые алгоритмы работы со списками

При рассмотрении алгоритмов тип информационного поля в них может отличаться. А переменные, которые будут использованы, считаются объявленными следующим образом:

Frame192

А1. Инициализация списка. (Создание нового и пустого списка)

Frame193

А2. Добавить элемент в конец односвязного списка

В процедуре реализован следующий алгоритм:

  1. создать элемент, подлежащий добавлению (зарезервировать память)

  2. полям данных присвоить значения входных параметров

  3. Если список не пуст:

  • установить указателю Next последнего элемента ссылку на новый

  • присвоить указателю Next нового элемента NIL

  • передвинуть Tail на новый элемент

  1. Если список пуст

  • установить указатель Head на новый элемент

  • установить указатель Tail на новый элемент

  • присвоить указателю Next нового элемента NIL

Frame194

А3. Удалить элемент из середины списка с освобождением памяти

(для случая односвязного списка):

Р – указатель на удаляемый элемент

P rev - указатель на элемент, стоящий перед удаляемым элементом

Фрагмент удаления имеет вид:

Frame195

А4. Исключить элемент из начала списка (вернув поле данных)

Frame196

А5. Включить элемент (pnew) в середину списка

Frame197

А6. Обработать каждый элемент линейного списка

Frame198

Пример. Пусть информационное поле элемента – целое число. Задача обработки: подсчитать количество элементов, значение информационных полей которых превышает значение Value:

Frame199

А7. Найти первый элемент, удовлетворяющий некоторому условию

Frame200

А8. Уничтожить список с освобождением памяти

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

Это производится следующим образом: Вначале указатель на первый элемент (тот, который записан в указателе на голову списка Head) помещается в рабочую переменную Р. Затем переменной Head присваивается значение указателя на следующий за ним. Это значение в односвязном списке размещается только в поле предыдущего (т.е. удаляемого) элемента. С этого момента бывший первый элемент выведен из списка, и его можно удалить из памяти компьютера, выполнив процедуру Dispose.

Frame201