Что-то такое:
| Код | #include <iostream>
template <class TYPE> class key_list { private: /////////////////// struct element { public: TYPE data; private: template <class TYPE> friend class key_list; element* next; element* prev; }; ///////////////// element* m_begin;//Первый элемент списка element* m_end;//Последний элемент списка int links_count; //Количество элементов в списке public: void display_all() const; //Показать все элементы списка void add(const TYPE& data); //Добавить новый элемент void remove(const TYPE& var); //Удалить необходимый элемент element* cursor (int pos)const; //Итератор
key_list():m_begin(0),m_end(0),links_count(0){} explicit key_list(const key_list<TYPE>& list); ~key_list(); };
////////////////////////////////////// //Показать все элементы template <class TYPE> void key_list<TYPE>::display_all() const { if (links_count == 0) { std::cout << "Nothing to display\n"; return; } element* current = m_begin; for (int i=0;i<links_count;++i) { std::cout << i << ") " << current->data << std::endl; current = current->next; } } ////////////////////////////////////// ///Добавление нового элемента template <class TYPE> void key_list<TYPE>::add(const TYPE& data) { element* link = new element; link->data = data; if (m_begin == 0) { m_begin = link; m_end = link; m_begin->next = link; link->prev = 0; } else { link->prev = m_end; m_end->next = link; m_end = link; } link->next = 0; ++links_count; } ////////////////////////////////////// ///Удаление элемента template <class TYPE> void key_list<TYPE>::remove(const TYPE& var) { element* current = m_begin;; for (int i = 0; i < links_count && current->data != var; ++i) { current = current->next; } if (current == 0) throw "Item doesn`t exists"; if (current != m_begin && current != m_end) //Если элемент по середине списка { current->prev->next = current->next; current->next->prev = current->prev; delete current; //Удаляем необходимый элемент } else { if (current == m_begin) //Если это первый элемент ... { m_begin = current->next; current->next->prev = 0; delete current; } else //Если это последний элемент ... { m_end = current->prev; current->prev->next = 0; delete current; } } --links_count; } ////////////////////////////////////// ///Итератор template <class TYPE> typename key_list<TYPE>::element* key_list<TYPE>::cursor (int pos)const { if (pos < 0 || pos >= links_count) throw ("Incorrect index - item doesn`t exists\n"); element* current = m_begin; for (int i = 0;i < pos; ++i) current = current->next; return current; } ////////////////////////////////////// ///Копирующий конструктор template <class TYPE> key_list<TYPE>::key_list(const key_list<TYPE>& list) { element* new_element = new element; //Копируем первый элемент списка new_element->data = (list.cursor(0))->data; new_element->next = 0; m_begin = new_element; m_end = new_element; //Копируем остальные элементы for (int i=1; i<list.links_count; ++i) { new_element = new element; new_element->data = (list.cursor(i))->data; m_end->next = new_element; m_end = new_element; } m_end->next = 0; links_count = list.links_count; } ////////////////////////////////////// ///Деструктор template <class TYPE> key_list<TYPE>::~key_list() { try { if (links_count > 0) { element* current = m_begin; while(current->next != 0) { current = current->next; delete current->prev; } delete m_end; } } catch (...) {} }
int main() { try { key_list<int> list; list.add(24); list.add(142); list.add(352); list.add(3); list.remove(24); list.display_all(); } catch (char* msg) { std::cout << msg; } return 0; }
|
Только я не понял что есть предыдущее значение? Вывести последний элемент списка?.. |