Funkcja usuń trójki niepodzielne przez K

0

Cześć mam problem z funkcją c++ oto treść zadania " funkcja usun rozpatrującą rozłączne trójki elementów sznura i usuwającą drugi i trzeci element trójki jeżeli w trójce nie ma elementów podzielnych przez K (gdzie K jest liczbą całkowitą dodatnią będącą parametrem funkcji), albo - w przeciwnym przypadku - pierwszy element trójki oraz element znajdujący się o dwa dalej niż koniec bieżącej trójki" (tj. następnik elementu stojącego bezpośrednio za trójką) jeśli taki element jest (kolejna rozpatrywana trójka będzie wtedy złożona z elementu stojącego bezpośrednio za bieżącą trójką i dwóch elementów stojących za elementem dodatkowo usuwanym). Trójki wybierane są tak, że pierwszy element sznura jest początkowym elementem pierwszej trójki; jeśli końcowe elementy sznura nie wchodzą w skład żadnej trójki, to nie są usuwane. Pamięć zajmowana przez usuwane elementy ma zostać zwolniona. Funkcja nie może używać pomocniczych funkcji, tablic, pomocniczych sznurów ani struktur danych dostępnych w bibliotece standardowej (wektorów, list, kolejek, itp.). Przykłady:
dla K=2 sznur 1,1.1.1,2,3,3,5,6,6,7,8 zostanie przekształcony do postaci 1,2,3,6,6,7 (po sprawdzaniu kolejno trójek: 1,1.1; 1,2,3 [dodatkowo usuwamy 5]; 3,6,6 [dodatkowo usuwamy 8]),
dla K=2 sznur -2,1,2,3,4,5,7,8,9 zostanie przekształcony do postaci 1,2,3,8,9."

Oto mój kod w c++:

void sznur::usun( int K )
{
    Node * current = pocz;
    Node * prev = nullptr;
    while( current && current->nast && current->nast->nast ) {
        Node * first = current;
        Node * second = current->nast;
        Node * third = current->nast->nast;
        Node * nextAfterThird = third->nast;
       
        if(( first->dane % K != 0 ) &&( second->dane % K != 0 ) &&( third->dane % K != 0 ) ) {
            if( prev ) {
                prev->nast = first;
            } else {
                pocz = first;
            }
            delete second;
            delete third;
            ileJest -= 2;
            current = nextAfterThird;
        } else {
            if( nextAfterThird ) {
                delete nextAfterThird;
                ileJest -= 2;
                first->nast = nextAfterThird->nast;
            }
        }
        prev = first;
    }
}
//1 1 1 1 2 3 3 5 6 6 7 8 K=2
//-2 1 2 3 4 5 7 8 9 K=2

Pytanie brzmi jak usunąć element trojki o dwa dalej np dla 1,2,3,3,5 usuwamy 1 i 5 jak go usunąć i jednocześnie jak zaktualizować wskaźnik żeby nie odczytywał miejsca pustego w miejscu 5 i przenieść go na następny z góry dziekuje za pomoc

0

Jest kilka problemów w tym kodzie...

  1. Gdy usuwasz elementy, musisz aktualizować wskaźniki.
  2. W przypadku, gdy jeden z elementów trójki jest podzielny przez K, musisz usuwać pierwszy element trójki oraz element znajdujący się o dwa dalej niż koniec bieżącej trójki (jeśli istnieje).
void sznur::usun( int K ) {
    Node * current = pocz;
    Node * prev = nullptr;

    while( current && current->nast && current->nast->nast ) {
        Node * first = current;
        Node * second = current->nast;
        Node * third = current->nast->nast;
        Node * fourth = third->nast ? third->nast->nast : nullptr;

        if(( first->dane % K != 0 ) && ( second->dane % K != 0 ) && ( third->dane % K != 0 )) {
            first->nast = third->nast;
            delete second;
            delete third;
            ileJest -= 2;

            current = first->nast; 
        } else {
            if(prev) {
                prev->nast = second;
            } else {
                pocz = second;
            }
            delete first;
            ileJest -= 1;

            if(fourth) {
                third->nast = fourth->nast;
                delete fourth;
                ileJest -= 1;
            }

            current = third->nast;
        }

        prev = current;
    }
}

Powinno zadziałać :)

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