Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Funkcja usuń trójki niepodzielne przez K - problem z usunięciem o dwa dalej

Ostatnio zmodyfikowano 2023-08-28 18:10
Autor Wiadomość
tybik843
Temat założony przez niniejszego użytkownika
Funkcja usuń trójki niepodzielne przez K - problem z usunięciem o dwa dalej
» 2023-08-28 16:58:35
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++:
C/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
P-180345
pekfos
» 2023-08-28 18:10:35
Jakby te zadania miały uczyć pisać kod, to by nie było idiotycznego zakazu używania funkcji pomocniczych. Jakbyś miał usunNastElement(prev), to by nie było pytania "jak poprzestawiać wskaźniki w tym konkretnym przypadku". Może wtedy byś zdał sobie sprawę że tu nie ma żadnych specjalnych przypadków. W kółko te same usuwanie elementu z listy jednokierunkowej, tylko nazwy zmiennych są inne.
P-180347
« 1 »
  Strona 1 z 1