Информатика и технология программирования

лодочные моторы

Циклический список - часть 3



zlist *p=find(n); // в циклическом списке - последним


zlist *q=new zlist; // Создать новый элемент списка


q-&#62data=s;
q-&#62next=p; // Включить перед найденным ( p)


q-&#62prev=p-&#62prev;
p-&#62prev-&#62next=q;
p-&#62prev=q;
}

Метод поиска минимального элемента является типичным итератором (см.5.6.), реализующим стандартный алгоритм поиска минимума в списке.


void *zlist::min( int (*cmp)(void*,void*))
{
if (next==this) return NULL; // Пустой список


zlist *pmin=next;
for (zlist *q=next; q!=this; q=q-&#62next)
{
if ( cmp(pmin-&#62data,q-&#62data) &#62 0) pmin=q;
}
return pmin-&#62data;
}

Отдельного обсуждения заслуживает деструктор. Дело в том, что деструктор может вызываться в двух совершенно различных ситуациях :



- когда удаляется элемент списка (при выполнении операции remove ). В этой ситуации он всегда является единственным удаляемым ;



- когда в программе удаляется сам объект-список. В этом случае деструктор вызывается для объекта-заголовка. Но если список не будет пустым, то деструктор должен предпринять меры к удалению включенных в него элементов списка.

Вся проблема заключается в том, что деструктор сам не в состоянии определить, в какой из приведенных ситуаций он находится. Ниже приводится один из способов решения проблемы. Метод remove перед удалением динамического объекта-элемента списка делает его "единственным". Деструктор же, наоборот, удаляет при помощи метода remove элементы списка, следующие за текущим объектом, пока он не станет единственным. Заметим, что при этом деструктор освобождает только элементы списка но ничего не делает с указателями на элементы данных (это отдельная проблема).


zlist::~zlist()
{ while (remove(0)!= NULL); }

В заключение рассмотрим пример использования объектов класса в программе . Хранимые в списке данные-строки являются статическими объектами, поэтому проблемы распределения памяти под них здесь не актуальны.


int CMP(void *s1,void *s2) {return strcmp((char*)s1,(char*)s2); }


zlist A;
A((void*)"aaaa");
A((void*)"bbbb");
A((void*)"cccc");
for (i=A.size()-1; i&#62=0; i--) cout &#60&#60 (char*)A[i] &#60&#60 " ";
cout &#60&#60 (char*)A.min(CMP) &#60&#60 " ";
cout &#60&#60 (char*)A.remove(1);




- Начало -  - Назад -  - Вперед -



Книжный магазин