fork download
  1. #include <iostream>
  2. struct element
  3. {
  4. int x;
  5. element * next;
  6. };
  7.  
  8. class List
  9. {
  10. public:
  11. List()
  12. : first_ (0)
  13. , last_ (0)
  14. , size_ (0)
  15. {}
  16. ~ List ()
  17. {
  18. while (size_)
  19. del (0);
  20. }
  21.  
  22. void add (int x)
  23. {
  24. element * t = new element {x, 0};
  25. (last_ ? last_->next : first_) = t;
  26. last_ = t;
  27. ++ size_;
  28. }
  29.  
  30. void del (unsigned n) // удаление n-го элемента
  31. {
  32. if (n >= size_)
  33. return; // или исключение здесь
  34.  
  35. element * pcur = first_; // в pcur - будет указатель на текущий элемент (который удаляется)
  36. element * prev = 0; // в prev - будет указатель на предыдущий элемент
  37. while (n --> 0) // ищем
  38. {
  39. prev = pcur;
  40. pcur = pcur->next;
  41. }
  42. (prev ? prev->next : first_) = pcur->next; // если удаляется первый, то прописываем адрес в голову, иначе в предыдущий элемент
  43. if (!pcur->next) // Если удалили последний, то прописываем в last
  44. last_ = prev;
  45. delete pcur; // удаляем
  46. -- size_; // приводим в соответствие размер
  47. }
  48.  
  49. int get (unsigned n) // получение n-го элемента
  50. {
  51. if (n >= size_)
  52. return 0; // исключение здесь надо бросить!
  53. element * p = first_;
  54. while (n --> 0)
  55. p = p->next;
  56. return p->x;
  57. }
  58.  
  59. void Show () // для отладки
  60. {
  61. element * p = first_;
  62. while (p)
  63. {
  64. std::cout << p->x << ' ';
  65. p = p->next;
  66. }
  67. std::cout << std::endl;
  68. }
  69. unsigned size () { return size_; }
  70.  
  71. private:
  72. element * first_;
  73. element * last_; // Указатель на последний для быстрой втавки
  74. unsigned size_;
  75. };
  76.  
  77. int main()
  78. {
  79. List lst;
  80.  
  81. // тестирование в 3 прохода
  82. for (int pass = 0; pass < 3; ++ pass)
  83. {
  84. for (int i = 0; i < 10; ++ i)
  85. lst.add(i);
  86. lst.Show ();
  87.  
  88. int i = 0;
  89. while (lst.size())
  90. {
  91. int n;
  92. switch (pass)
  93. {
  94. case 0 : n = 0; break; // при 1-ом проходе удаляем 1-ый элем.
  95. case 1 : n = lst.size() - 1; break; // при 2-ом проходе удаляем последний элем.
  96. default : n = i ++ % lst.size(); break; // при 3-ом проходе хитро удаляем где-то в середине :)
  97. }
  98. lst.del (n);
  99. lst.Show ();
  100. }
  101. }
  102. }
  103.  
Success #stdin #stdout 0s 3412KB
stdin
Standard input is empty
stdout
0 1 2 3 4 5 6 7 8 9 
1 2 3 4 5 6 7 8 9 
2 3 4 5 6 7 8 9 
3 4 5 6 7 8 9 
4 5 6 7 8 9 
5 6 7 8 9 
6 7 8 9 
7 8 9 
8 9 
9 

0 1 2 3 4 5 6 7 8 9 
0 1 2 3 4 5 6 7 8 
0 1 2 3 4 5 6 7 
0 1 2 3 4 5 6 
0 1 2 3 4 5 
0 1 2 3 4 
0 1 2 3 
0 1 2 
0 1 
0 

0 1 2 3 4 5 6 7 8 9 
1 2 3 4 5 6 7 8 9 
1 3 4 5 6 7 8 9 
1 3 5 6 7 8 9 
1 3 5 7 8 9 
1 3 5 7 9 
3 5 7 9 
3 5 9 
3 9 
9