list.cpp 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. #include "list.h"
  2. #define HOLDER
  3. #define __TEMPLATE template<typename Type>
  4. #define TEMPLATE(rtype) __TEMPLATE rtype
  5. #define ADT List<Type>
  6. #define NODE ADT::Node
  7. #define ITERATOR ADT::iterator
  8. // #pragma region List<Type>::iterator
  9. TEMPLATE(HOLDER) ITERATOR::iterator(Node* ptr) {
  10. _ptr = ptr;
  11. }
  12. TEMPLATE(typename ITERATOR&) ITERATOR::operator++() {
  13. _ptr = _ptr->_next;
  14. return *this;
  15. }
  16. TEMPLATE(typename ITERATOR&) ITERATOR::operator--() {
  17. _ptr = _ptr->_prev;
  18. return *this;
  19. }
  20. TEMPLATE(bool) ITERATOR::operator== (const ITERATOR& it) {
  21. // TBD 其它信息比较
  22. return _ptr == it._ptr;
  23. }
  24. TEMPLATE(bool) ITERATOR::operator!= (const ITERATOR& it) {
  25. return !(*this == it);
  26. }
  27. // #pragma endregion
  28. // #pragma region List<Type>
  29. TEMPLATE(HOLDER) ADT::List() : dummy(&dummy, &dummy) {};
  30. TEMPLATE(HOLDER) ADT::~List() {
  31. Node* curr = head->_next;
  32. Node* next = nullptr;
  33. for (; curr != &dummy;) {
  34. next = curr->_next;
  35. delete curr;
  36. curr = next;
  37. }
  38. }
  39. TEMPLATE(typename ITERATOR) ADT::begin() { return ADT::iterator(head->_next); }
  40. TEMPLATE(typename ITERATOR) ADT::end() { return ADT::iterator(head); }
  41. TEMPLATE(typename ITERATOR) ADT::rbegin() { return ADT::iterator(tail->_prev); }
  42. TEMPLATE(typename ITERATOR) ADT::rend() { return ADT::iterator(tail); }
  43. TEMPLATE(typename ITERATOR&) ADT::operator[] (int index) {
  44. Node* curr = head;
  45. for (; index >= 0; --index) {
  46. if (curr == nullptr) {
  47. return end();
  48. }
  49. curr = curr->next;
  50. }
  51. return iterator(curr);
  52. }
  53. TEMPLATE(ADT&) ADT::operator+= (Type& value) {
  54. Node* node = new Node(value, tail->_prev, tail);
  55. tail->_prev->_next = node;
  56. tail->_prev = node;
  57. return *this;
  58. }
  59. TEMPLATE(typename ITERATOR) ADT::append(Type& value) {
  60. Node* node = new Node(value, tail->_prev, tail);
  61. tail->_prev->_next = node;
  62. tail->_prev = node;
  63. return iterator(node);
  64. }
  65. // #pragma endregion
  66. #undef HOLDER
  67. #undef __TEMPLATE
  68. #undef TEMPLATE
  69. #undef ADT
  70. #undef NODE
  71. #undef ITERATOR