• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Lista dynamiczna w c++ funkcja usuwająca elementy dlaczego nie działa?

0 głosów
813 wizyt
pytanie zadane 13 maja 2018 w C i C++ przez KotDrewniany Początkujący (250 p.)

Mam problem z listą dynamiczną. Funkcja powinna usuwać cztery elementy w przypadku kiedy trzeci element podzielny jest przez pierwsze dwa. W przeciwnym przypadku powinna usuwać jedynie ostatni element czwórki. Program przestaje działać i zwraca Process returned -1073741819 (0xC0000005).

void Sznur::usun_c22_czworki()
{
    Box *tmp = glowa; // tymczasowy wskaznik
    int licznik = 0;

    while(tmp!=NULL)
    {
        licznik++;
        tmp=tmp->next;
    }

    cout << "Licznik: " << licznik << endl;
    cout << "Rozmiar: " << rozmiar << endl;

    int ile_czworek = licznik/4;

    cout << "Ile_czworek: " << ile_czworek << endl;

    Box *pierwszy=NULL;
    Box *drugi=NULL;
    Box *trzeci=NULL;
    Box *czwarty=NULL;

    if (ile_czworek>=1)
    {
        pierwszy = glowa;
        drugi = pierwszy->next;
        trzeci = drugi->next;
        czwarty = trzeci->next;
        cout << "Zrobione!" << endl;
    }
    else
    {
        return;
    }

    Box *pred = NULL;

    for (int i=0; i<ile_czworek; i++)
    {
        if (trzeci->value%pierwszy->value==0 && trzeci->value%drugi->value==0)
        {
            if (pred==NULL) // przypadek w ktorym 4 znajduje sie na poczatku listy
            {
                Box *killer = NULL;
                glowa = czwarty->next;

                if(glowa!=NULL)
                {
                    drugi=glowa->next;
                    trzeci=drugi->next;
                    czwarty=trzeci->next;
                }
                else
                {
                    drugi=NULL;
                    trzeci=NULL;
                    czwarty=NULL;
                }

                while(pierwszy!=glowa) // ustawiamy wsk pierwszy na nowa glowe
                {
                    killer = pierwszy;
                    pierwszy = pierwszy->next;
                    delete killer;
                }
            }
            else
            {
                Box *killer=NULL;
                pred->next = czwarty->next;

                if(pred->next!=NULL)
                {
                    drugi=czwarty->next->next;
                    trzeci=drugi->next;
                    czwarty=trzeci->next;
                }
                else
                {
                    drugi=NULL;
                    trzeci=NULL;
                    czwarty=NULL;
                }

                while(pierwszy!=pred->next)
                {
                    killer=pierwszy;
                    pierwszy=pierwszy->next;
                    delete killer;
                }
            }
        }
        else
        {
            pred = trzeci;
            Box *killer = czwarty;

            if(czwarty->next!=NULL)
            {
                pierwszy=czwarty->next;
                drugi=pierwszy->next;
                trzeci=drugi->next;
                czwarty=trzeci->next;
            }
            else
            {
                pierwszy=NULL;
                drugi=NULL;
                trzeci=NULL;
                czwarty=NULL;
            }

            pred->next=pierwszy;
            delete killer;
        }
    }
}

 

komentarz 13 maja 2018 przez RafalS VIP (122,820 p.)
Wrzuć linka do całego kodu. Wtedy będzie można to odpalić i wrzucić w debuger.

1 odpowiedź

0 głosów
odpowiedź 13 maja 2018 przez j23 Mędrzec (195,240 p.)

 

Box* prev = glowa;
Box* pierwszy = prev;
Box* drugi = pierwszy ? pierwszy->next : NULL;
Box* trzeci = drugi ? drugi->next : NULL;
Box* czwarty = trzeci ? trzeci->next : NULL;

while(pierwszy && drugi && trzeci && czwarty)
{
	if (trzeci->value % pierwszy->value == 0 && 
		trzeci->value % drugi->value == 0)
	{
		Box* tmp = pierwszy;
		if(prev != pierwszy) pierwszy = prev->next = czwarty->next;
		else glowa = pierwszy = prev = czwarty->next;

		delete tmp;
		delete drugi;
		delete trzeci;
		delete czwarty;
	}
	else 
	{
		prev = trzeci;
		pierwszy = prev->next = czwarty->next;
		delete czwarty;
	}

	drugi = pierwszy ? pierwszy->next : NULL;
	trzeci = drugi ? drugi->next : NULL;
	czwarty = trzeci ? trzeci->next : NULL;
}

Tak nie prościej?

Podobne pytania

0 głosów
1 odpowiedź 503 wizyt
pytanie zadane 9 maja 2020 w C i C++ przez chomik1 Nowicjusz (140 p.)
0 głosów
2 odpowiedzi 1,155 wizyt
0 głosów
2 odpowiedzi 654 wizyt
pytanie zadane 11 sierpnia 2016 w C i C++ przez manjaro Nałogowiec (37,390 p.)

93,424 zapytań

142,421 odpowiedzi

322,643 komentarzy

62,782 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...