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

Cykliczna lista dwukierunkowa, usuwanie określonych elemetów

Object Storage Arubacloud
0 głosów
268 wizyt
pytanie zadane 28 marca 2017 w C i C++ przez Nowaczek Nowicjusz (240 p.)

Cześć.

Mam funkcje która powinna usuwać wszystkie elementy o danej wartości z listy. Problem polega na tym, że program crashuje sie za każdym razem kiedy próbuję usunąć wartości które w którymś miejscu są obok siebie, na przykład 0,7,9,9,8 (kiedy próbuje usunąć 9). Dodatkowo jest jeszcze problem kiedy lista składa się z np samych 0 i próbuję to usunąć. 

Funkcja:

void removeAllValue(List2W& l, int x){
        if(isEmpty(l))
            return;

        Element *temp = l.head, *del;
        int i;

        if ( l.head->value == x ){
            temp = temp->next;
            deleteHead(l, i);
        }

        do {
            if ( temp->value == x ){
                if ( l.tail == temp ) {
                    temp = temp->next;
                    deleteTail(l, i);
                    return;
                }
                del = temp;
                temp = temp->next;
                del->next->prev = del->prev;
                del->prev->next = del->next;
                delete del;
            } else {
                temp = temp->next;
            }
        } while ( temp->prev != l.tail);
    }

 

Cały kod https://pastebin.com/57SeC0uK  (na początku trzeba wpisać komendy go i in, następnie ih żeby dodać na początku listy)

1 odpowiedź

0 głosów
odpowiedź 28 marca 2017 przez mbabane Szeryf (79,280 p.)
wybrane 11 kwietnia 2017 przez Nowaczek
 
Najlepsza

Zdaje sie ze zmienna i z linii 6 nie ma nigdzie przypisania wartosci.

komentarz 28 marca 2017 przez Nowaczek Nowicjusz (240 p.)
DeleteHead z 10 lini potrzebuje tej zmiennej, choć nie jest nigdzie później wykorzystywana, ale niestety nie tutaj leży problem.
komentarz 28 marca 2017 przez mbabane Szeryf (79,280 p.)
ale w sumie, jak masz zamiar usunac cala liste to wlasciwie po co jest if z linii 14?
komentarz 28 marca 2017 przez Nowaczek Nowicjusz (240 p.)
Prawdą jest, że gdyby funkcja działała jak powinna to można by się obyć bez tego ifa, ale to nie w tym problem
komentarz 28 marca 2017 przez mbabane Szeryf (79,280 p.)

Kiedys uzywalem takiej listy i odnalalzem programik, w ktorym to bylo. Do usuniecia calej listy uzywalem takiego kodu:

void kasuj(lista *f)
{     
   lista start, tmp;
   
   start=(*f);
   do
   {
     tmp=(*f)->next;
     delete((*f));     
     (*f)=tmp; 
   } while(start!=(*f));
}

Ewentualnie, mozesz jeszcze skorzystac z tego kodu:
http://eduinf.waw.pl/inf/alg/001_search/0088.php#table491

1
komentarz 29 marca 2017 przez Nowaczek Nowicjusz (240 p.)
Chyba źle to wyraziłem. Nie chodzi mi o algorytm usuwający całą listę. Chodzi mi o algorytm. który będzie usuwał z listy wszystkie elementy o danej wartości. Dla przykładu: lista=5,6,7,9,7,9, jeżeli użyję tego algorytmu dla wartości 7 to pozbędę się wszystkich 7 i nic poza tym, lista będzie miala postać 5,6,9,9
komentarz 29 marca 2017 przez mbabane Szeryf (79,280 p.)
A ok, przepraszam rzeczywisice jest to napisane w pierwszym zdaniu, chyba za szybko przeczytałem, zaraz zobacze jak to mozna zrobic.
1
komentarz 29 marca 2017 przez mbabane Szeryf (79,280 p.)
edycja 29 marca 2017 przez mbabane

Chyba udlao mi sie stworzyc to co chciales osiagnac (wydaje mi sie ze łatwiej by to bylo zrobic gdyby byl jakis licznik, ktory mowi ile elementow jest na liscie):

void delAllTargetValues( lista *f, int valueToDel)
{
    lista tmp, end;

    end = (*f);
    (*f) = (*f)->next;
    while ( ( (*f) != end ) )
    {
        if ( (*f)->dana == valueToDel )
        {
            (*f)->prev->next = (*f)->next;
            (*f)->next->prev = (*f)->prev;

            tmp = (*f)->next;
            delete((*f));
            (*f) = tmp;
        }
        else
        {
            (*f) = (*f)->next;
        }
    }

    if ( (*f)->dana == valueToDel )
    {
        (*f)->prev->next = (*f)->next;
        (*f)->next->prev = (*f)->prev;
        tmp = (*f)->next;
       delete((*f));
        (*f) = tmp;
    }
}

Podobne pytania

0 głosów
1 odpowiedź 338 wizyt
0 głosów
1 odpowiedź 814 wizyt
0 głosów
1 odpowiedź 1,129 wizyt
pytanie zadane 16 stycznia 2017 w C i C++ przez Smileandlove Nowicjusz (230 p.)

92,579 zapytań

141,429 odpowiedzi

319,657 komentarzy

61,963 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...