Файл: 6. Разработка контейнера на основе адресного списка.pdf

Добавлен: 20.10.2018

Просмотров: 1033

Скачиваний: 17

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

 

 

 

class  CircleListContainer  { 

   private  Posrednik  First;  // указатель на первый элемент списка 

   private  int   ContInf; 

   public  CircleListContainer  (int  ainf) { First = null ;  ContInf = ainf;}   

   public  void  Add(Circle  aCirc,  int  ainf)  

        { First = new  Posrednik (ainf,   First,   aCirc) ;} // красиво и компактно! 

   public  Circle   Delete (int   ainf) {…}  // удаление 

   public  Circle   Search (int   aRad) {…}  // поиск по радиусу 

   public  void  ShowAll ( )   

 { Posrednik   Temp = First;   // вспом. указатель для прохода по списку 

     while  (Temp != null ) 

            { Temp.GetCirc ( ).Show ( );  // доступ к методу объекта-окружности 

               Temp = Temp.GetNext ( );  // доступ к адресному полю 

                         }   // конец цикла 

  }  //  конец метода отображения 

   public  void  MoveAll (int  ax,  int  ay ) {…}  

 };   //  конец описания класса

 

 

Замечание. В языках  Java  и  C# вместо двух отдельных классов можно 

воспользоваться  возможностью  объявления  вложенных  классов:  класс 

«ЭлементCписка» можно объявить внутри класса «СписковыйКонтейнер». В 

этом  случае  доступ  к  полям  данных  объектов-элементов  можно  выполнять 

напрямую, без использования методов доступа. 

В  заключение  приведем  фрагменты  программ,  демонстрирующих 

использование спискового контейнера. 

   var  MyCont : CircleListContainer; 

   MyCont := CircleListContainer.Create (…); 

   MyCirc := TCircle.Create(random(…), random(…), random(…)); 

   MyCont.Add (‘текст’,  MyCirc); 


background image

 

 

   //  создали и добавили еще несколько окружностей 

   MyCont.ShowAll; 

   MyCont.MoveTo (…); 

 

   CircleListContainer   MyCont = new  CircleListContainer (…); 

   Circle   MyCirc = new  Circle (. . . . .); 

   MyCont.Add (MyCirc,  1);    

      //  повторить два последних действия необходимое число раз 

   MyCont.ShowAll ( ); 

   MyCont.MoveAll (50, 50);

 

 

Упрощенная  диаграмма  классов  для  спискового  контейнера  объектов-

окружностей имеет следующий вид: 

Класс «СписковыйКонтейнер» 

Информация о контейнере 
число элементов 
адрес первого элемента списка
 
Конструктор(ы), Методы доступа 
Методы добавления, удаления, поиска 

 

Методы-итераторы

 

 

 

 

 

 

 

 

    1..n 

Класс объектов-посредников «ЭлементСписка» 
информация 
адрес следующего посредника 
адрес объекта-окружности 
Конструктор 
Методы доступа

 

 

 

 

 

 

 

 

   1..1 

Класс информационных объектов-окружностей 
Координаты центра 
радиус 


background image

 

 

Конструктор(ы) 
Методы доступа 
Методы отображения и перемещения

 

 

Во втором, более простом варианте класс объектов-посредников не 

нужен,  но  использовать  данный  способ  можно  не  всегда.  В  качестве 

примера  приведем  описание  (сокращенное)  класса  «Студент»  со 

служебным адресным полем. 

TStudent = class                    

         private                       

            Fam : string;       

            NextStud : TStudent; 

// служебное связующее поле 

. . . . . . . . . .  

         public                         

            constructor  Create (aFam : string

 

aNext : TStudent);          

            function  GetNext : TStudent; 

// получить ссылку на следующего     

            procedure  SetNext (aStud : TStudent);      // изменить ссылку 

        // остальные методы — как ранее было описано   

      end;

         

   

 

Класс «СписковыйКонтейнер» для объектов-студентов: 

StudListContainer = class 

    private 

      infCont : string;    //  или другой необходимый тип 

      First : TStudent;     // указатель на первого студента в списке 

    public   

      сonstructor   Create (ainf : string);  // конструктор создает пустой список 

      function  GetFirst : TStudent;    


background image

 

 

      procedure  Add (aFam : string );     // добавление - в начало списка 

      function  Delete (aFam : string) : boolean;  // удаление  

      function  GetStud (aFam : string) : TStudent;  // поиск по фамилии 

// остальные методы  

 end

Реализация метода добавления студента в начало списка: 

procedure   StudListContainer.Add (aFam : string);  

    begin   First := TStudent.Create (aFam, First);    

    end;

 

 

В свою очередь, объекты-контейнеры сами могут быть элементами  

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

собираться  в  рамках  контейнера  «Факультет»,  объекты-факультеты 

могут  объединяться  на  уровне  контейнера  «Институт»  и  т. д.  При  этом 

способы объединения могут быть разными, как на основе массивов, так 

и на основе адресных связей.