Zadanie "Usuń podciągi podzielne przez K oraz jeden element za nim z listy połączonej"

0

Cześć mam problem z funkcją usuń oto treść zadania

image
Kod mojej funkcji wygląda tak

void sznur::usun(int K)
{
    Node*zaszuk=nullptr;
    Node*szuk=pocz;
    while(szuk!=nullptr)
    {
        Node*koniec=szuk;
        Node*poprzedni=szuk->nast;
        int c=1;
        while(poprzedni!=nullptr && koniec->dane%K==0)
        {
            c++;
            koniec=poprzedni;
            poprzedni = poprzedni->nast;
        }
        if(c>K)
        {
            Node*killer=szuk;
            szuk=poprzedni;
            if(zaszuk!=nullptr)
            {
                zaszuk->nast=poprzedni;
            }
            else
            {
                pocz=poprzedni;
            }
            delete killer;
            ileJest--;
        }
        else
        {
            zaszuk = koniec;
            szuk = poprzedni;
        }
    }
}
//10 10 10 9 9 9 8 8 6 5 4 3 2 2 1 1 K=2 -> 9 9 4 3 1
//6 6 6 3 2 1 1 K=3 -> 1 1
//10 10 9 8 8 8 7 6 6 5 4 4 K=2 -> pusty

problem pojawia się przy ostatnim sznurze który powinien być pusty a wg, mojego rozwiązania wyświetla ostatnie dwie liczby sznura 4 , 4 pytanie gdzie źle zrobiłem rozwiązanie kodu gdzie należy poprawić kod proszę o pomoc z góry dziękuje za pomoc i przepraszam za treść jako screen

0

Przecież te wszystkie zadania mają taki sam schemat:

  1. Pętla dopóki pozostało X elementów (do tej pory 2 lub 3).
  2. jeśli zachodzi jakiś warunek na tych X elementach, to je usuń, a jeśli dodatkowo kolejny też istnieje, i spełnia jakiś warunek, to też go usuń.

Zaadoptuj poprzednie rozwiązanie, i będzie działać. A czemu to konkretne nie działa? Zgaduję, że znów przez ten warunek z czapy, if(c>K).

0
  1. nie używaj polskich znaków w nazwach zmiennych
  2. użyj IDE do formatowania kodu
  3. przeczytaj książkę czysty kodu i spraw aby Twój kod łatwo się czytało
0

Cały problem z tym kodem polega na tym, że pomieszane są szczegóły listy jednokierunkowej, z wysokopoziomową logiką opisującą co ma być usunięte.
Najlepiej napisać to tak:

// funkcja usuwa elementy listy dla których "f" zwraca true
void sznur::usunJesli(std::function<bool(int)> f)
{
    Node** p = &pocz;
    while (*p) {
        if (f((*p)->dane))
        {
            auto doSkasowania = *p;
            *p = (*p)->nast;
            delete doSkasowania;
        } else {
            p = &(*p)->nast;
        }
    }
}

void usunPodzilenePrzezKINastpujące(sznur& sz, int K)
{
    bool kasujNastepny = false;
    sz.usunJesli([&kasujNastepny, K](int x) {
        auto kasujTen = x % K == 0;
        return std::exchange(kasujNastepny, kasujTen) || kasujTen;
    });
}

Będzie jeden kod na kasowanie elementów, a wszystkie inne kombinacje, będą umieszczone gdzie indziej i nie będą rozpraszać.

1 użytkowników online, w tym zalogowanych: 0, gości: 1