Как известно, списки одна из самых распространенных структур данных. Во многих современных языках программирования они включены в число стандартных типов. В Delphi Object Pascal это класс TList. TList реализован как динамический массив бестиповых указателей, что позволяет создавать неоднородные списки и быстро получать элементы списка по номеру. Тому, кто хочет программировать в Delphi, необходимо получить навыки в использовании этого важного класса.
Ниже подробно рассмотрен вопрос построения класса односвязных неоднородных списков, а так же характерный пример их применения. Все описания, необходимые для класса односвязных списков должны быть расположены в одном модуле.
Для создания связного списка определим тип его информационной части. Разумно считать, что информацию можно копировать и представлять в символьном виде. Отсюда возникает определение:
Обратите внимание на то, что копирование информации нельзя определить не зная ее структуры, поэтому метод Copy указан с дескриптором abstract. Такой метод не нужно (и нельзя) реализовывать в разделе implementation. Он лишь указывает разработчикам подклассов, что для каждого сорта информации должна быть определена операция копирования. Представление объекта в символьном виде тоже зависит от типа объекта, поэтому Print объявлен с дескриптором virtual.
Пользователь класса списков заинтересован лишь в хранении и получении информации из списка. Разработчику же связного списка понадобится вспомогательный класс с указателем на следующий элемент TItem.
Этот класс не предназначен для самостоятельного использования. Все его атрибуты можно было бы и скрыть. К сожалению, Pascal не позволяет этого сделать, т.к. в интерфейсе останутся методы TObject. Все что мы можем, это скрыть поля и не предоставить методов работы с ними. Но поля объектов этого класса останутся доступными в пределах нашего модуля. Собственно список— это информация, размещенная в последовательных пунктах. В список информацию можно добавлять и удалять. Пункты списка можно добавлять в начало, в конец или в середину. Если считать, что список замыкается пустым указателем на информацию (Nil), то все три варианта обеспечиваются методом Insert. Вставка перед Nil — это добавление в конец, перед заданным элементом — это в середину, а перед первым — в начало.
Обратите внимание на то, что список, согласно нашему определению, это информация и сам содержит пункты с информацией. Здесь заложена основа для создания ветвящихся списков.
Одна из целей этого параграфа — продемонстрировать подход к сложным АТД как к контейнерам для хранения информации. В самом деле, определенный выше класс TRList позволяет помещать в объект разнородную информацию, удалять ее, копировать и печатать. Как узнать сколько в списке пунктов, какой из пунктов первый, имеется ли определенный пункт в списке? Всего этого сделать невозможно, мы определили список как типичный контейнерный класс.
Для доступа к информации контейнеров создаются классы итераторы. Специальный случай итератора, позволяющий только получать информацию из контейнера называется селектором.
Введение селектора позволяет в нескольких частях программы работать со списком методом “первый–следующий” и каждый объект–селектор может иметь свой текущий элемент. Если подпрограмма только получает информацию из списка, но не добавляет новых пунктов, достаточно передавать ей правильно подготовленный селектор.
В свою очередь селектор описан в том же модуле что и список, и ему доступны закрытые члены класса TRList. Это позволяет сделать доступ более эффективным.
Опубликовал Kest
June 21 2011 13:41:59 ·
0 Комментариев ·
6879 Прочтений ·
• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •
Комментарии
Нет комментариев.
Добавить комментарий
Рейтинги
Рейтинг доступен только для пользователей.
Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.
Нет данных для оценки.
Гость
Вы не зарегистрированны? Нажмите здесь для регистрации.