Являясь клиентом универсального класса
public void start ()
{ cursor = first; } public void finish ()
{
while (cursor.next!= null)
cursor = cursor.next;
}
public void forth()
{ if (cursor.next!= null) cursor = cursor.next; }
Операция
Основной операцией является операция добавления элемента с ключом в список. Возможны различные ее вариации, из которых рассмотрим только одну — новый элемент добавляется за текущим, отмеченным курсором. Вот текст этого метода:
public void add(К key, Т item)
{
Node
if (first == null)
{
first = newnode; cursor = newnode;
newnode.key = key; newnode.item = item;
}
else
{
newnode.next = cursor.next; cursor.next = newnode;
newnode.key = key; newnode.item = item;
}
}
Заметьте, аргументы метода имеют соответствующие родовые параметры, чем и обеспечивается универсальный характер списка. При добавлении элемента в список различаются два случая — добавление первого элемента и всех остальных.
Рассмотрим теперь операцию поиска элемента по ключу, реализация которой потребовала ограничения универсальности типа ключа к;
public bool findstart(К key)
{
Node
while (temp!= null)
{
if (temp.key.CompareTo(key) == 0) {cursor=temp;
return(true);}
temp= temp.next;
}
return (false);
}
Искомые элементы разыскиваются во всем списке. Если элемент найден, то курсор устанавливается на найденном элементе и метод возвращает значение
Два метода класса являются запросами, позволяющими извлечь ключ и элемент списка, который отмечен курсором:
public К Key ()
{
return (cursor.key);
}
public T Item()
{
return(cursor.item);
}
Давайте рассмотрим теперь тестирующую процедуру — клиента нашего списка, демонстрирующую работу со списками, в которых элементы и ключи имеют разные типы: