#include <iostream>
struct element
{
int x;
element * next;
};
class List
{
public:
List()
: first_ (0)
, last_ (0)
, size_ (0)
{}
~ List ()
{
while (size_)
del (0);
}
void add (int x)
{
element * t = new element {x, 0};
(last_ ? last_->next : first_) = t;
last_ = t;
++ size_;
}
void del (unsigned n) // удаление n-го элемента
{
if (n >= size_)
return; // или исключение здесь
element * pcur = first_; // в pcur - будет указатель на текущий элемент (который удаляется)
element * prev = 0; // в prev - будет указатель на предыдущий элемент
while (n --> 0) // ищем
{
prev = pcur;
pcur = pcur->next;
}
(prev ? prev->next : first_) = pcur->next; // если удаляется первый, то прописываем адрес в голову, иначе в предыдущий элемент
if (!pcur->next) // Если удалили последний, то прописываем в last
last_ = prev;
delete pcur; // удаляем
-- size_; // приводим в соответствие размер
}
int get (unsigned n) // получение n-го элемента
{
if (n >= size_)
return 0; // исключение здесь надо бросить!
element * p = first_;
while (n --> 0)
p = p->next;
return p->x;
}
void Show () // для отладки
{
element * p = first_;
while (p)
{
std::cout << p->x << ' ';
p = p->next;
}
std::cout << std::endl;
}
unsigned size () { return size_; }
private:
element * first_;
element * last_; // Указатель на последний для быстрой втавки
unsigned size_;
};
int main()
{
List lst;
// тестирование в 3 прохода
for (int pass = 0; pass < 3; ++ pass)
{
for (int i = 0; i < 10; ++ i)
lst.add(i);
lst.Show ();
int i = 0;
while (lst.size())
{
int n;
switch (pass)
{
case 0 : n = 0; break; // при 1-ом проходе удаляем 1-ый элем.
case 1 : n = lst.size() - 1; break; // при 2-ом проходе удаляем последний элем.
default : n = i ++ % lst.size(); break; // при 3-ом проходе хитро удаляем где-то в середине :)
}
lst.del (n);
lst.Show ();
}
}
}
I2luY2x1ZGUgPGlvc3RyZWFtPgpzdHJ1Y3QgZWxlbWVudAp7CiAgIGludCB4OwogICBlbGVtZW50ICogbmV4dDsKfTsKCmNsYXNzIExpc3QKewpwdWJsaWM6CiAgIExpc3QoKQogICAgICA6IGZpcnN0XyAoMCkKICAgICAgLCBsYXN0XyAoMCkgCiAgICAgICwgc2l6ZV8gKDApIAogICAgICB7fQogICB+IExpc3QgKCkKICAgewogICAgICB3aGlsZSAoc2l6ZV8pCiAgICAgICAgIGRlbCAoMCk7CiAgIH0KCiAgIHZvaWQgYWRkIChpbnQgeCkKICAgewogICAgICBlbGVtZW50ICogdCA9IG5ldyBlbGVtZW50IHt4LCAwfTsKICAgICAgKGxhc3RfID8gbGFzdF8tPm5leHQgOiBmaXJzdF8pID0gdDsKICAgICAgbGFzdF8gPSB0OwogICAgICArKyBzaXplXzsKICAgfQoKICAgdm9pZCBkZWwgKHVuc2lnbmVkIG4pICAvLyDRg9C00LDQu9C10L3QuNC1IG4t0LPQviDRjdC70LXQvNC10L3RgtCwCiAgIHsKICAgICAgaWYgKG4gPj0gc2l6ZV8pIAogICAgICAgICByZXR1cm47IC8vINC40LvQuCDQuNGB0LrQu9GO0YfQtdC90LjQtSDQt9C00LXRgdGMCgogICAgICBlbGVtZW50ICogcGN1ciA9IGZpcnN0XzsgLy8g0LIgcGN1ciAtINCx0YPQtNC10YIg0YPQutCw0LfQsNGC0LXQu9GMINC90LAg0YLQtdC60YPRidC40Lkg0Y3Qu9C10LzQtdC90YIgKNC60L7RgtC+0YDRi9C5INGD0LTQsNC70Y/QtdGC0YHRjykKICAgICAgZWxlbWVudCAqIHByZXYgPSAwOyAgICAgIC8vINCyIHByZXYgLSDQsdGD0LTQtdGCINGD0LrQsNC30LDRgtC10LvRjCDQvdCwINC/0YDQtdC00YvQtNGD0YnQuNC5INGN0LvQtdC80LXQvdGCCiAgICAgIHdoaWxlIChuIC0tPiAwKSAgICAgICAgICAvLyDQuNGJ0LXQvAogICAgICB7CiAgICAgICAgIHByZXYgPSBwY3VyOwogICAgICAgICBwY3VyID0gcGN1ci0+bmV4dDsKICAgICAgfQogICAgICAocHJldiA/IHByZXYtPm5leHQgOiBmaXJzdF8pID0gcGN1ci0+bmV4dDsgIC8vINC10YHQu9C4INGD0LTQsNC70Y/QtdGC0YHRjyDQv9C10YDQstGL0LksINGC0L4g0L/RgNC+0L/QuNGB0YvQstCw0LXQvCDQsNC00YDQtdGBINCyINCz0L7Qu9C+0LLRgywg0LjQvdCw0YfQtSDQsiDQv9GA0LXQtNGL0LTRg9GJ0LjQuSDRjdC70LXQvNC10L3RggogICAgICBpZiAoIXBjdXItPm5leHQpIC8vINCV0YHQu9C4INGD0LTQsNC70LjQu9C4INC/0L7RgdC70LXQtNC90LjQuSwg0YLQviDQv9GA0L7Qv9C40YHRi9Cy0LDQtdC8INCyIGxhc3QKICAgICAgICAgIGxhc3RfID0gcHJldjsgCiAgICAgIGRlbGV0ZSBwY3VyOyAvLyDRg9C00LDQu9GP0LXQvAogICAgICAtLSBzaXplXzsgICAgLy8g0L/RgNC40LLQvtC00LjQvCDQsiDRgdC+0L7RgtCy0LXRgtGB0YLQstC40LUg0YDQsNC30LzQtdGACiAgIH0KCiAgIGludCBnZXQgKHVuc2lnbmVkIG4pIC8vINC/0L7Qu9GD0YfQtdC90LjQtSBuLdCz0L4g0Y3Qu9C10LzQtdC90YLQsAogICB7CiAgICAgIGlmIChuID49IHNpemVfKSAKICAgICAgICAgcmV0dXJuIDA7IC8vINC40YHQutC70Y7Rh9C10L3QuNC1INC30LTQtdGB0Ywg0L3QsNC00L4g0LHRgNC+0YHQuNGC0YwhCiAgICAgIGVsZW1lbnQgKiBwID0gZmlyc3RfOwogICAgICB3aGlsZSAobiAtLT4gMCkKICAgICAgICAgcCA9IHAtPm5leHQ7CiAgICAgIHJldHVybiBwLT54OwogICB9CgogIHZvaWQgU2hvdyAoKSAvLyDQtNC70Y8g0L7RgtC70LDQtNC60LgKICB7CiAgICAgIGVsZW1lbnQgKiBwID0gZmlyc3RfOwogICAgICB3aGlsZSAocCkKICAgICAgewogICAgICAgICBzdGQ6OmNvdXQgPDwgcC0+eCA8PCAnICc7CiAgICAgICAgIHAgPSBwLT5uZXh0OwogICAgICB9CiAgICAgIHN0ZDo6Y291dCA8PCBzdGQ6OmVuZGw7CiAgfQogIHVuc2lnbmVkIHNpemUgKCkgeyByZXR1cm4gc2l6ZV87IH0KCnByaXZhdGU6CiAgIGVsZW1lbnQgKiBmaXJzdF87CiAgIGVsZW1lbnQgKiBsYXN0XzsgLy8g0KPQutCw0LfQsNGC0LXQu9GMINC90LAg0L/QvtGB0LvQtdC00L3QuNC5INC00LvRjyDQsdGL0YHRgtGA0L7QuSDQstGC0LDQstC60LgKICAgdW5zaWduZWQgc2l6ZV87Cn07CgppbnQgbWFpbigpCnsKICAgTGlzdCBsc3Q7CgogICAvLyDRgtC10YHRgtC40YDQvtCy0LDQvdC40LUg0LIgMyDQv9GA0L7RhdC+0LTQsAogICBmb3IgKGludCBwYXNzID0gMDsgcGFzcyA8IDM7ICsrIHBhc3MpCiAgIHsKICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgKysgaSkKICAgICAgICAgbHN0LmFkZChpKTsKICAgICAgbHN0LlNob3cgKCk7CgogICAgICBpbnQgaSA9IDA7CiAgICAgIHdoaWxlIChsc3Quc2l6ZSgpKQogICAgICB7CiAgICAgICAgIGludCBuOwogICAgICAgICBzd2l0Y2ggKHBhc3MpCiAgICAgICAgIHsKICAgICAgICAgICAgY2FzZSAwICA6IG4gPSAwOyBicmVhazsgICAgICAgICAgICAgICAgICAgIC8vINC/0YDQuCAxLdC+0Lwg0L/RgNC+0YXQvtC00LUg0YPQtNCw0LvRj9C10LwgMS3Ri9C5INGN0LvQtdC8LgogICAgICAgICAgICBjYXNlIDEgIDogbiA9IGxzdC5zaXplKCkgLSAxOyBicmVhazsgICAgICAgLy8g0L/RgNC4IDIt0L7QvCDQv9GA0L7RhdC+0LTQtSDRg9C00LDQu9GP0LXQvCDQv9C+0YHQu9C10LTQvdC40Lkg0Y3Qu9C10LwuCiAgICAgICAgICAgIGRlZmF1bHQgOiBuID0gaSArKyAlIGxzdC5zaXplKCk7IGJyZWFrOyAgICAvLyDQv9GA0LggMy3QvtC8INC/0YDQvtGF0L7QtNC1INGF0LjRgtGA0L4g0YPQtNCw0LvRj9C10Lwg0LPQtNC1LdGC0L4g0LIg0YHQtdGA0LXQtNC40L3QtSA6KQogICAgICAgICB9CiAgICAgICAgIGxzdC5kZWwgKG4pOwogICAgICAgICBsc3QuU2hvdyAoKTsKICAgICAgfQogICB9Cn0K