List.h 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. #include <iostream>
  2. #include <any>
  3. template <typename T>
  4. struct Node
  5. {
  6. T value;
  7. Node<T>* next = nullptr;
  8. Node<T>* prev = nullptr;
  9. };
  10. template <typename T>
  11. class List
  12. {
  13. private:
  14. Node<T>* start = nullptr;
  15. Node<T>* end = nullptr;
  16. Node<T>* getNode(int index)
  17. {
  18. if (index >= lenght)
  19. throw "index > lenght";
  20. Node<T>* currentNode = start;
  21. for(int i = 0; i < index; i++) {
  22. currentNode = currentNode->next;
  23. }
  24. return currentNode;
  25. }
  26. public:
  27. int lenght;
  28. List()
  29. {
  30. Node<T>* start = nullptr;
  31. Node<T>* end = nullptr;
  32. lenght = 1;
  33. }
  34. ~List()
  35. {
  36. Node<T>* currentNode = start;
  37. while (currentNode->next!=nullptr)
  38. {
  39. currentNode = currentNode->next;
  40. delete currentNode->prev;
  41. }
  42. delete currentNode;
  43. }
  44. void add(T value)
  45. {
  46. Node<T>* node = new Node<T>;
  47. node->value = value;
  48. if(start==nullptr) {
  49. start = node;
  50. end = node;
  51. return;
  52. }
  53. node->prev = end;
  54. end->next = node;
  55. end = node;
  56. lenght++;
  57. }
  58. void pop()
  59. {
  60. end = end->prev;
  61. end->next = nullptr;
  62. lenght--;
  63. }
  64. void pop(Node<T>* node)
  65. {
  66. // Node<T>* prev = node->prev;
  67. node->next->prev = node->prev;
  68. node->prev->next = node->next;
  69. lenght--;
  70. }
  71. void pop(int index)
  72. {
  73. if (index==0) {
  74. start = getNode(index+1);
  75. lenght--;
  76. return;
  77. }
  78. if (index>=lenght-1) {
  79. pop();
  80. return;
  81. }
  82. Node<T>* node = getNode(index);
  83. pop(node);
  84. }
  85. T operator[](int index)
  86. {
  87. return getNode(index)->value;
  88. }
  89. friend std::ostream &operator <<(std::ostream &os, List &c)
  90. {
  91. os << "( ";
  92. Node<T>* currentNode = c.start;
  93. while (currentNode->next!=nullptr)
  94. {
  95. os << currentNode->value << " = ";
  96. currentNode = currentNode->next;
  97. }
  98. os << currentNode->value << " )";
  99. return os;
  100. }
  101. };