Jak usunąć ze sznura nieprzedłużalne ciągi znaków

0

image

przykład dla sznura

6 2 5 2 6 1 4 3 2 6 6 5 ->2 5 1 4 3 5
2 4 4 4 3 2 ->3 2
2 1 2 1 2 1 2 -> m pusty

O to mój kod

void sznur::usun()
{
    Node *zaszuk = nullptr;
    Node *szuk = pocz;
    while(szuk!=nullptr )
    {
        int war=szuk->dane;
        Node*koniec=szuk;
        while(koniec->nast!=nullptr && koniec->nast->dane>=war)
        {
            koniec=koniec->nast;
            war=koniec->dane;
        }
        if(koniec!=szuk)
        {
            if(zaszuk==nullptr)
            {
                pocz=koniec->nast;
            }
            else
            {
                zaszuk->nast=koniec->nast;
            }
            Node*killer=szuk;
            while(killer!=koniec->nast)
            {
                Node*nast=killer->nast;
                delete killer;
                killer=nast;
                ileJest--;
            }
            szuk=koniec->nast;
        }
        else
        {
            zaszuk=szuk;
            szuk=szuk->nast;
        }
    }
}

tylko jest problem dla tego sznura 6 2 5 2 6 1 4 3 2 6 6 5 i ostatniego 2 1 2 1 2 1 2 nie dokońca usuwa zostawia 2 na końcu pytanie dlaczego tak się dzieje i gdzie popełniłem błąd?

3

Hej. Dość skomplikowany i pogmatwany kod Ci wyszedł. Proponuję zrobić coś w stylu:

void sznur::usun_nast_wezel(Node* prev) {
    if (pocz == nullptr) {
        // Pusty sznur, nie ma co usuwać.
    } else if (prev == nullptr) {
        // jak prev==nullptr, to znaczy, że usuwamy z początku
        Node* new_pocz = pocz->next;
        delete pocz;
        pocz = new_pocz;
    } else {
        // Tutaj, prev->next nie może być nullptr, gdyż zakładamy, że 
        // usun_nast_wezel będzie stosowany do usuwania węzłów, które istnieją.
        Node* do_usuniecia = prev->next;
        prev->next = do_usuniecia->next;
        delete do_usuniecia;
    }
}

I teraz, implementując usun, robisz to w dwóch krokach:

  1. przejdź pętlą po sznurze i znajdź największą wartość.
  2. dla każdego węzła w, jeśli w.dane == maks || (w->nast != nullptr && w->nast->dane == maks), robisz usun_nast_wezel(w).

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