Интернет-журнал "Домашняя лаборатория", 2007 №9
Шрифт:
/// хранимого элемента 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:
/// </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: require: true;
/// ensure: сделать активным первый элемент;
/// </summary>
public void start
{
cursor = first; index = 1;
}//start
/// <summary>
/// finish: require: true;
/// ensure: сделать активным последний элемент;
/// </summary>
public void finish
{
cursor = last; index = count;
}//finish
/// <summary>
/// go_prev: require: not (index = 1);
/// ensure: сделать активным предыдущий элемент;
/// </summary>
public void go_prev
{
cursor = cursor.Prev; index-;
}// go_prev
/// <summary>
/// go_next: require: not (index = count);
/// ensure: сделать активным последующий элемент
/// </summary>
public void go_next
{
cursor = cursor.Next; index++;
}// go_next
/// <summary>
/// go_i(i): require: (i in [1, count]);
/// ensure:
сделать активным элемент с индексом/// </summary>
/// <param name="i" x/param>
public void go_i(int i)
{
if(i >index)
while (i>index)
{
cursor = cursor.Next; index++;
}
else if(i<index)
while (i<index)
{
cursor = cursor.Prev; index-;
}
}// go_i
/// операции поиска:
/// <summary>
/// search_prev(elem): require: not (index = 1);
/// ensure: сделать активным первый элемент elem слева от курсора;
/// </summary>
/// <param name="elem">искомый элемент</param>
public virtual void search_prev(Figure elem)
{
bool found = false;
while (!found && (index!=1))
{
cursor = cursor.Prev; index-;
found = (elem == item);
}
search_res = found;
}// search_prev
/// <summary>
/// успех или неуспех поиска сохранять в булевской
/// переменной search_res
/// search_next: require: not (index = count);
/// ensure: сделать активным первый элемент elem справа от курсора;
/// успех или неуспех поиска сохранять в булевской
/// переменной search_res
/// </summary>
/// <param name="elem"></param>
public virtual void search_next(Figure elem)
{
bool found = false;
while (!found && (index!=count))
{
cursor = cursor.Next; index++;
found = (elem == item);
}
search_res = found;
}//search_next
}
}
Заметьте, класс подробно документирован. Для методов класса указываются предусловия и постусловия. Обратите внимание, в соответствии с принципами контрактного программирования клиент класса, прежде чем вызвать метод, должен проверить выполнимость предусловия, что повышает корректность работы системы в целом. Именно так и будет реализован вызов этих методов в классе формы, где осуществляется работа со списком.
Классы элементов списка
Рассмотрим классы, описывающие элементы списков — элементы с одним и с двумя указателями:
using System;
namespace Shapes
{
/// <summary>
/// Класс Linkable(T)задает элементы списка, включающие:
/// информационное поле типа Т — item
/// ссылку на элемент типа Linkable — next
/// Функции:
/// конструктор new: —> Linkable
/// запросы:
/// Get_Item: Linkable —> T
/// Get_Next: Linkable —> Linkable