123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- #include "list.h"
- #define HOLDER
- #define __TEMPLATE template<typename Type>
- #define TEMPLATE(rtype) __TEMPLATE rtype
- #define ADT List<Type>
- #define NODE ADT::Node
- #define ITERATOR ADT::iterator
- // #pragma region List<Type>::iterator
- TEMPLATE(HOLDER) ITERATOR::iterator(Node* ptr) {
- _ptr = ptr;
- }
- TEMPLATE(typename ITERATOR&) ITERATOR::operator++() {
- _ptr = _ptr->_next;
- return *this;
- }
- TEMPLATE(typename ITERATOR&) ITERATOR::operator--() {
- _ptr = _ptr->_prev;
- return *this;
- }
- TEMPLATE(bool) ITERATOR::operator== (const ITERATOR& it) {
- // TBD 其它信息比较
- return _ptr == it._ptr;
- }
- TEMPLATE(bool) ITERATOR::operator!= (const ITERATOR& it) {
- return !(*this == it);
- }
- // #pragma endregion
- // #pragma region List<Type>
- TEMPLATE(HOLDER) ADT::List() : dummy(&dummy, &dummy) {};
- TEMPLATE(HOLDER) ADT::~List() {
- Node* curr = head->_next;
- Node* next = nullptr;
- for (; curr != &dummy;) {
- next = curr->_next;
- delete curr;
- curr = next;
- }
- }
- TEMPLATE(size_t) ADT::erase(Type& target) {
- Node* curr = head->_next;
- Node* next = nullptr;
- for (; curr != &dummy;) {
- if (curr->_value == target) {
- erase(curr->value);
- return (size_t)1ull;
- }
- }
- return (size_t)0ull;
- }
- TEMPLATE(void) ADT::erase(Node* node) {
- node->_prev->_next = node->_next;
- node->_next->_prev = node->_prev;
- delete node;
- }
- TEMPLATE(typename ITERATOR) ADT::begin() { return ADT::iterator(head->_next); }
- TEMPLATE(typename ITERATOR) ADT::end() { return ADT::iterator(head); }
- TEMPLATE(typename ITERATOR) ADT::rbegin() { return ADT::iterator(tail->_prev); }
- TEMPLATE(typename ITERATOR) ADT::rend() { return ADT::iterator(tail); }
- TEMPLATE(typename ITERATOR&) ADT::operator[] (int index) {
- Node* curr = head;
- for (; index >= 0; --index) {
- if (curr == nullptr) {
- return end();
- }
- curr = curr->next;
- }
- return iterator(curr);
- }
- TEMPLATE(ADT&) ADT::operator+= (Type& value) {
- Node* node = new Node(value, tail->_prev, tail);
- tail->_prev->_next = node;
- tail->_prev = node;
- return *this;
- }
- TEMPLATE(typename ITERATOR) ADT::append(Type& value) {
- Node* node = new Node(value, tail->_prev, tail);
- tail->_prev->_next = node;
- tail->_prev = node;
- return iterator(node);
- }
- // #pragma endregion
- #undef HOLDER
- #undef __TEMPLATE
- #undef TEMPLATE
- #undef ADT
- #undef NODE
- #undef ITERATOR
|