//----------------------------------------------------------------------------- // Заголовочный файл DList.h //----------------------------------------------------------------------------- template class DListIterator; // объявление класса template class DListNode { public: T data; DListNode* next; DListNode* previous; }; template class DLinkedList { public: DListNode* head; DListNode* tail; int count; DLinkedList (); ~DLinkedList(); void PushBack(T); void PushFront(T); void PopFront(); void PopBack(); void Remove (DListIterator&); void Insert (DListIterator&, T); }; template class DListIterator { public: DListNode* node; DListIterator(DListNode*); DListIterator(); void Forward(); void Backward(); bool Valid(); }; template DLinkedList::DLinkedList () : head(NULL), tail(NULL), count(0) {} template DLinkedList::~DLinkedList() { DListNode* temp; while (head != NULL) { temp = head->next; delete head; head = temp; } } // Добавление элемента в конец списка. template void DLinkedList::PushBack(T d) { if (count > 0) { DListNode* temp = new DListNode; temp->next = NULL; temp->previous = tail; temp->data = d; tail->next = temp; tail = temp; count++; } else if (count == 0) { DListNode* temp = new DListNode; temp->next = NULL; temp->previous = NULL; temp->data = d; head = tail = temp; count++; } } // Добавление элемента в начало списка template void DLinkedList::PushFront(T d) { if (count > 0) { DListNode* temp = new DListNode; temp->next = head; temp->previous = NULL; temp->data = d; head->previous = temp; head = temp; count++; } else if (count == 0) { DListNode* temp = new DListNode; temp->next = NULL; temp->previous = NULL; temp->data = d; head = tail = temp; count++; } } // Удаление элемента из начала списка. template void DLinkedList::PopFront() { if (count == 1) { delete head; head = tail = NULL; count--; } else if (count == 2) { delete head; tail->previous = NULL; head = tail; count--; } else if (count > 2) { DListNode* temp = head->next; delete head; head = temp; head->previous = NULL; count--; } } // Удаление элемента из конца списка. template void DLinkedList::PopBack() { if (count == 1) { delete tail; head = tail = NULL; count--; } else if (count == 2) { delete tail; head->next = NULL; tail = head; count--; } else if (count > 2) { DListNode* temp = tail->previous; delete tail; tail = temp; tail->next = NULL; count--; } } // Вставка нового элемента в список. template void DLinkedList::Insert (DListIterator& itr, T d) { if (count == 0) { DListNode* temp = new DListNode; head = tail = temp; head->next = NULL; head->previous = NULL; head->data = d; itr.node = head; count++; } else if (count == 1 && itr.Valid()) { DListNode* temp = new DListNode; head->next = temp; temp->previous = head; temp->next = NULL; temp->data = d; tail = itr.node = temp; count++; } else if (count > 1 && itr.Valid()) { if (itr.node == tail) { DListNode* temp = new DListNode; temp->previous = itr.node; temp->data = d; temp->next = NULL; tail->next = temp; tail = itr.node = temp; } else { DListNode* temp = new DListNode; DListNode* next = itr.node->next; DListNode* prev = itr.node; temp->next = next; temp->previous = prev; temp->data = d; next->previous = temp; prev->next = temp; itr.node = temp; } count++; } } // Удаление элемента из списка. template void DLinkedList::Remove (DListIterator& itr) { if (count == 1) { delete head; head = tail = itr.node = NULL; count--; } if (count > 1 && itr.Valid()) { if (itr.node == tail) { tail = itr.node->previous; delete itr.node; tail->next = NULL; itr.node = head; } if (itr.node == head) { head = itr.node->next; delete itr.node; head->previous = NULL; itr.node = head; } else { DListNode* next = itr.node->next; DListNode* prev = itr.node->previous; next->previous = prev; prev->next = next; delete itr.node; itr.node = next; } count--; } } template DListIterator::DListIterator (DListNode* n) { node = n; } template DListIterator::DListIterator () { node = NULL; } template void DListIterator::Forward () { if (node != NULL) node = node->next; } template void DListIterator::Backward () { if (node != NULL) node = node->previous; } template bool DListIterator::Valid() { if (node == NULL) return 0; return 1; }