с двусвязным списком, задача простая: удалить элементы стоящие на четных позициях(начинаем с нуля, он четный). Все бы хорошо, но у меня программа доходит только до предпоследнего элемента, соответственно его не удаляет. А почему она не берет последний элемент? А как сделать, чтобы и его тоже обрабатывало? Код функции по ссылке ниже, пастебин
https://pastebin.com/HVVdKXxt
мне кажется, ты переусложнил
нууу, я старался рассмотреть все возможные ситуации
ну вот смотри, здесь тоже рассмотрены все возможные ситуации: class node { int id = 0; node* prev = nullptr; node* next = nullptr; public: explicit node(int id) : id(id) {} explicit node(int id, std::unique_ptr<node> &&n) : id(id), next(n.release()) { next->prev = this; } node(const node&) = delete; node& operator=(const node&) = delete; ~node() { delete next; } public: static std::unique_ptr<node> delete_even_nodes(std::unique_ptr<node> r) { node* h = r.release(); assert(h); node* n = h->next; for (int c = 0; h; ++c) { if ((c % 2) == 0) { node* p = h->next; if (h->prev) h->prev->next = p; if (h->next) h->next->prev = h->prev; h->next = nullptr; delete h; h = p; } else { h = h->next; } } return std::unique_ptr<node>(n); } friend std::ostream& operator<<(std::ostream& s, const node& n) { for (const node* h = &n; h; h = h->next) { std::cout << h->id << (h->next?", ":""); } return s; } }; int main() { std::unique_ptr<node> r = std::make_unique<node>(0 , std::make_unique<node>(1 ,std::make_unique<node>(2 , std::make_unique<node>(3) ) ) ); r = node::delete_even_nodes(std::move(r)); std::cout << "result: " << *r; return 0; }
Спасибо! Действительно, оказалось, я много пурги лишней написал
Обсуждают сегодня