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

Problem z usuwaniem trójek w sznure w c++

Ostatnio zmodyfikowano 2023-08-12 19:39
Autor Wiadomość
tybik843
Temat założony przez niniejszego użytkownika
Problem z usuwaniem trójek w sznure w c++
» 2023-08-11 16:00:27
Mam problem z zadaniem potrzebuje pomocy oto treść mojego zadania

funkcja usun rozpatrującą rozłączne trójki elementów sznura i usuwającą: drugi element trójki jeśli średnia trójki jest większa od G (gdzie G jest liczbą całkowitą będącą parametrem funkcji), a w przeciwnym przypadku - całą trójkę oraz dwa, znajdujące się najbliżej za trójką (czyli pierwszy i drugi odpowiedni, idąc w kierunku końca sznura), elementy przechowujące liczby występujące w tej trójce (o ile takie elementy istnieją; przy czym jeśli jest tylko jeden taki element, to też jest usuwany). Usunięte elementy za trójkami" nie wchodzą skład kolejnych sprawdzanych trójek. Pamięć zajmowana przez usuwane elementy ma zostać zwolniona. Funkcja nie może używać tablic, pomocniczych sznurów ani struktur danych dostępnych w bibliotece standardowej (wektorów, list, kolejek, itp.). Przykład: dla G-100 sznur 7,2,6,4,8,9,3,2,5,6,500,2,2,1,1,1,7 zostanie przekształcony do postaci 3,500,7 (pierwsza trójka to 7,2,6; jej średnia nie jest większa niż G, więc usuwamy całą trójkę i do tego 2 i 6 znajdujące się w dalszej części sznura (pierwsze znalezione w dalszej części sznura liczby z trójki); kolejna trójka to 4,8,9, jej średnia nie jest większa niż G, ale usuwamy tylko tę trójkę, bo w dalszej części sznura nie ma 4, 8 ani 9; kolejna trójka to 3,5,500 (2 i 6 zostały wcześniej usunięte), ma ona średnią większą od G, więc usuwamy z niej 5, kolejna trójka to 2,2,1, jej średnia nie jest większa od G, więc usuwamy całą trójkę i do tego 1,1 stojące za nią)

Oto mój kod:
C/C++
void sznur::usun( int G )
{
   
Node * tmp = pocz;
   
int ilosc = 1;
   
int war = 0;
   
float srd = 0;
   
while( tmp != nullptr )
   
{
       
if( tmp->dane % 2 == 0 )
       
{
           
srd += tmp->dane;
           
ilosc++;
       
}
       
tmp = tmp->nast;
       
war++;
   
}
   
srd = srd / ilosc;
   
Node * zaszuk = nullptr;
   
Node * a = pocz;
   
while( a != nullptr && a->nast != nullptr && a->nast->nast != nullptr )
   
{
       
Node * jeden = a;
       
Node * dwa = a->nast;
       
Node * trzy = a->nast->nast;
       
Node * szukaj = trzy->nast;
       
Node * poprzedni = trzy;
       
int licznik = 2;
       
if( srd > G )
       
{
           
if( zaszuk != nullptr ) {
               
zaszuk->nast = jeden;
           
} else {
               
pocz = jeden;
           
}
           
delete dwa;
           
ileJest--;
           
zaszuk = trzy;
           
a = zaszuk->nast;
       
} else {
           
if( zaszuk != nullptr ) {
               
zaszuk->nast = szukaj->nast->nast;
           
} else {
               
pocz = poprzedni->nast->nast->nast->nast;
           
}
           
           
delete jeden;
           
delete dwa;
           
delete trzy;
           
ileJest -= 3;
           
while( szukaj != nullptr && licznik > 0 ) {
               
if( szukaj->dane == jeden->dane || szukaj->dane == dwa->dane || szukaj->dane == trzy->dane ) {
                   
poprzedni->nast = szukaj->nast;
                   
delete szukaj;
                   
ileJest--;
                   
szukaj = poprzedni->nast;
                   
licznik--;
               
} else {
                   
poprzedni = szukaj;
                   
szukaj = szukaj->nast;
               
}
            }
           
zaszuk = trzy;
           
a = zaszuk->nast;
       
}
    }
}
//7 2 6 4 8 9 3 2 5 6 500 2 2 1 1 1 7 -> 3,500,7
problem polega na tym iż nie rozumiem jak usunąć dalsze elementy sznura chodzi mi o to zdanie "pierwsza trójka to 7,2,6; jej średnia nie jest większa niż G, więc usuwamy całą trójkę i do tego 2 i 6 znajdujące się w dalszej części sznura (pierwsze znalezione w dalszej części sznura liczby z trójki);" Moje pytanie brzmi jak usunąć dalsze elementy czyli 2 i 6 bo usunięciem trójki nie mam problemu ale mam problem z usunięciem 2 i 6 proszę o pomoc w rozwiązaniu zadania z góry dziękuje
P-180253
pekfos
» 2023-08-12 16:07:23
Odwołujesz się do usuniętych elementów wskazywanych przez jeden, dwa i trzy.
P-180258
tybik843
Temat założony przez niniejszego użytkownika
» 2023-08-12 19:06:59
Jeszcze dopytam jak zaktualizować wskaźnik przy usuwaniu żeby się nie odwoływać do usuniętych elementów na przykładzie mojego kodu??
P-180262
pekfos
» 2023-08-12 19:39:01
Usuń te elementy później, gdy nie będą już potrzebne.
C/C++
while( szukaj != nullptr && licznik > 0 ) {
   
if( szukaj->dane == jeden->dane || szukaj->dane == dwa->dane || szukaj->dane == trzy->dane ) { // Tu używasz
       
poprzedni->nast = szukaj->nast;
       
delete szukaj;
       
ileJest--;
       
szukaj = poprzedni->nast;
       
licznik--;
   
} else {
       
poprzedni = szukaj;
       
szukaj = szukaj->nast;
   
}
}
// Więc usuń tu??
P-180263
« 1 »
  Strona 1 z 1