Циклический список организован в соответствии с принятым принципом совмещения заголовка списка и его элементов в объектах одного класса. Первый элемент списка - текущий объект, доступный через this , является заголовком и не содержит данных. Остальные элементы - динамические, создаются при помещении в список новых данных и удаляются при их исключении.
class zlist
{
void *data;
zlist *next,*prev;
zlist *find(int); // Вспомогательный метод извлечения
public: // элемента списка по номеру
zlist(); // Конструктор пустого списка
~zlist(); //
int size(); // Количество элементов
void *operator[](int); // Извлечение
void operator()(void*,int); // Включение по номеру
void *remove(int); // Удаление по номеру
void *remove(void*); // Удаление по указателю на элемент данных
void *min( int(*)(void*,void*)); // Итератор поиска минимального
};
Конструктор списка определяет текущий объект как единственный элемент, который в соответствии с правилами построения циклического списка "замкнут сам на себя".
zlist::zlist()
{ prev=next=this; }
На вспомогательном методе извлечения элемента списка по его последовательному номеру можно увидеть все особенности объектно-ориентированной реализации. Первый элемент списка-заголовок является текущим объектом ( this ), при этом в процессе "счета" он не учитывается. Цикл просмотра начинается с первого информационного элемента ( this->next или next ) и завершается по возвращении на заголовок. В последнем случае логический номер не найден.
zlist *zlist::find(int n=-1)
{ zlist *p;
for (p=next; n!=0 && p!=this; n--, p=p->next);
return p; }
Метод подсчета количества элементов в структуре данных стандартным образом обходит циклический список .
int zlist::size()
{ int n; zlist *p;
for (n=0, p=next; p!=this; n++, p=p->next);
return n; }
Метод получения указателя на элемент данных по логическому номеру - переопределенная операция [ ] . Получает указатель на элемент списка при помощи внутреннего метода find и выделяет из него данные .