📚 Hub Books: Онлайн-чтение книгРазная литератураИнтернет-журнал "Домашняя лаборатория", 2007 №9 - Журнал «Домашняя лаборатория»

Интернет-журнал "Домашняя лаборатория", 2007 №9 - Журнал «Домашняя лаборатория»

Шрифт:

-
+

Интервал:

-
+
1 ... 398 399 400 401 402 403 404 405 406 ... 415
Перейти на страницу:

   /// курсором. Элементами списка являются объекты

   /// TwoLinkable, хранящие, помимо указателей на двух

   /// преемников, объекты типа G.Курсор будет определять

   /// текущий (активный) элемент списка. Класс будет

   /// определять симметричные операции по отношению к курсору.

   /// Конструкторы:

   /// Конструктор без параметров будет создавать пустой список

   /// Запросы:

   /// empty: require: true; возвращает true для пустого списка

   /// item: require: not empty(); возвращает активный элемент типа G;

   /// require: true; возвращает число элементов списка;

   /// count: count in[0,n] (count == 0) eqviv empty ();

   /// index: require: not empty(); возвращает индекс активного элемента.

   /// search_res: require: true; возвращает true, если последний поиск был успешным.

   /// Команды:

   /// put_left(elem): require: true;

   /// ensure: добавить новый элемент (elem) слева от курсора;

   /// put_right(elem): require: true;

   /// ensure: добавить новый элемент (elem) справа от курсора;

   /// remove: require: not empty();

   /// ensure: удалить активный элемент;

   /// особо обрабатывается удаление последнего и единственного элементов

   /// операции с курсором:

   /// start: require: true;

   /// ensure: сделать активным первый элемент;

   /// finish: require: true;

   /// ensure: сделать активным последний элемент;

   /// go_prev: require: not (index = 1);

   /// ensure: сделать активным предыдущий элемент;

   /// go_next: require: not (index = count);

   /// ensure: сделать активным последующий элемент;

   /// go_i(i): require: (i in [1, count]);

   /// ensure: сделать активным элемент с индексом i;

   /// операции поиска:

   /// search_prev(elem): require: not (index = 1);

   /// ensure: сделать активным первый элемент elem слева от курсора;

   /// Успех или неуспех поиска сохранять в булевской переменной search_res

   /// search_next: require: not (index = count);

   /// ensure: сделать активным первый элемент elem справа от курсора;

   /// успех или неуспех поиска сохранять в булевской переменной search_res

   /// </summary>

   public class TwoWayList

   {

      public TwoWayList()

      {

          first = cursor = last = null;

          count = index = 0;

          search_res = false;

      }//конструктор

      /// <summary>

      /// first, cursor, last — ссылки на первый,

      /// активный и последний элементы списка

      /// Запросы count, index search_res также

      /// реализуются атрибутами.

      /// Запросы empty, item реализуются функциями

      /// </summary>

      protected TwoLinkable first, cursor, last;

      protected int count, index;

      protected bool search_res;

      //доступ на чтение к закрытым свойствам;

      public int Count

      {

          get

          {

              return(count);

          }

      }

      public int Index

      {

           get

           {

              return(index);

           }

      }

      public bool Search_res

      {

           get

           {

               return(search_res);

           }

      }

      /// <summary>

      /// require: true; возвращает true для непустого списка

      /// </summary>

      /// <returns></returns>

      public bool empty()

      {

          return(first == null);

      }//empty

      /// <summary>

      /// require: not empty(); возвращает активный

      /// элемент типа G;

      /// </summary>

      /// <returns></returns>

      public Figure item()

      {

           return(cursor.Item);

      }//item

      /// <summary>

      /// require: true;

      /// ensure: добавить новый элемент (elem) слева

      /// от курсора;

      /// </summary>

      /// <param name="еlеm">Тип Figure играет роль родового типа G

      /// хранимого элемента elem</param>

      public void put_left(Figure elem)

      {

           TwoLinkable newitem = new TwoLinkable();

           newitem.Item = elem;

           newitem.Next = cursor;

           if (empty()) //список пуст

           {

               first = cursor = last = newitem;

               index =1; count = 1;

           }

           else

           {

               if (index == 1)

                    first =newitem;

               else

                    cursor.Prev.Next = newitem;

               newitem.Prev = cursor.Prev; cursor.Prev = newitem;

               count++; index++;

            }

      }//put_right

      /// <summary>

      /// require: true;

      /// ensure: добавить новый элемент (elem) справа от курсора;

      /// </summary>

      /// <param name="еlеm">Тип Figure играет роль родового типа G

      /// хранимого элемента elem</param>

      public void put_right(Figure elem)

      {

           TwoLinkable newitem = new TwoLinkable();

            newitem.Item = elem;

            newitem.Prev = cursor;

            if (empty()) //список пуст

            {

                 first = cursor = last = newitem;

                 index =1; count = 1;

            }

            else

            {

                 if (index == count)

                     last =newitem;

                  else

                     cursor.Next.Prev = newitem;

                     newitem.Next = cursor.Next; cursor.Next = newitem;

                     count++;

            }

      }//put_right

      public void remove()

      {

            if (count == 1)

            {

                  first = last = cursor = null;

                  index=0;

            }

            else if(index==l)

            {

                  first = cursor.Next;

                  cursor.Prev = null;

                  cursor = cursor.Next;

            }

            else if(index == count)

            {

                  last = cursor.Prev;

                  cursor.Next = null;

                  cursor = cursor.Prev;

                  index--;

            }

            else

            {

                  cursor.Prev.Next = cursor.Next;

                  cursor.Next.Prev = cursor.Prev;

                  cursor = cursor.Next;

            }

            count--;

       }//remove

       /// операции с курсором:

       /// <summary>

       /// start:

1 ... 398 399 400 401 402 403 404 405 406 ... 415
Перейти на страницу:

Комментарии

Обратите внимание, что комментарий должен быть не короче 20 символов. Покажите уважение к себе и другим пользователям!

Никто еще не прокомментировал. Хотите быть первым, кто выскажется?