fork download
  1. #include <cstdio>
  2.  
  3. template<typename T>class List
  4. {
  5. public:
  6. class Item;
  7. private:
  8. class Next
  9. {
  10. Item *next;
  11. friend class List;
  12. };
  13. class Prev
  14. {
  15. Item *prev;
  16. friend class List;
  17. };
  18. Next zero;
  19. Prev stop;
  20. public:
  21. class Item : public Next, public Prev
  22. {
  23. friend class List;
  24. public:
  25. T data;
  26. Item(T data) : data(data) {}
  27. };
  28. List()
  29. {
  30. zero.next = static_cast<Item*>(&stop);
  31. stop.prev = static_cast<Item*>(&zero);
  32. }
  33. Item* push(T data, List::Item *before = nullptr)
  34. {
  35. if (!before) before = static_cast<Item*>(&zero);
  36. Item *self = new Item(data);
  37. before->prev->next = self;
  38. self->prev = before->prev;
  39. before->prev = self;
  40. self->next = before;
  41. return self;
  42. }
  43. void enumerate(void(func)(T data))
  44. {
  45. for (auto it = zero.next; it != static_cast<Item*>(&stop); it = it->next)
  46. func(it->data);
  47. }
  48. };
  49.  
  50. int main()
  51. {
  52. List<const char*> man;
  53. man.push("кресты");
  54. auto p1 = man.push("лучший");
  55. auto p2 = man.push("в мире");
  56. man.enumerate([](const char *s) {
  57. puts(s);
  58. });
  59. puts("");
  60. man.push("язык", p2);
  61. man.push("самый", p1);
  62. man.enumerate([](const char *s) {
  63. puts(s);
  64. });
  65. return 0;
  66. }
  67.  
Success #stdin #stdout 0s 4284KB
stdin
Standard input is empty
stdout
кресты
лучший
в мире

кресты
самый
лучший
язык
в мире