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

lista cykliczna rekurencja

Object Storage Arubacloud
0 głosów
298 wizyt
pytanie zadane 10 maja 2018 w C i C++ przez kikosiak Obywatel (1,010 p.)

Cześć.

Jak mogę zamienić funkcje remove_list na funkcję rekurencyjną? 

void remove_list(struct list_node **list_pointer)
{
    if(*list_pointer)
    {
        struct list_node *start = *list_pointer;
        do
        {
            struct list_node *next = (*list_pointer)->next;
            free(*list_pointer);
            *list_pointer = next;
        }
        while(*list_pointer!=start);
        *list_pointer = NULL;
    }
}

void removeList(struct list_node **list_pointer)
{
    struct list_node *start=(*list_pointer);
    if(NULL!=(*list_pointer))
    {

        do
        {
            removeList(&(*list_pointer)->next);
            free(*list_pointer);

        }
        while((*list_pointer)!=start);
    }
}

Próbowałem tak jak jest pokazane w funkcje removeList, ale jest błąd pętla sie nie kończy. 

1 odpowiedź

0 głosów
odpowiedź 10 maja 2018 przez Ehlert Ekspert (212,790 p.)

Napisz funkcję która przyjmuje jako argument wskaźnik na node. Funkcja:

  1. Kończy działanie jeśli node to null
  2. W przeciwnym wypadku tworzy lokalny wskaźnik typu node na element kolejny. 
  3. Usuwa pamięć na którą wskazuje wskaźnik z argumentu. 
  4. Wywołuje samą siebie jako argument podając wcześniej utworzony lokalny wskaźnik z następnym węzłem. 

Pamiętaj, że dobrym nawykiem jest podpisywanie pod wskaźnik wartości NULL, jeśli na nic on nie wskazuje. 

komentarz 10 maja 2018 przez Ehlert Ekspert (212,790 p.)
Btw nie mam pojęcia z jakiego powodu korzystasz ze wskaźników na wskaźnik. Nie jest to konieczne, a łatwo o pomyłkę.
komentarz 10 maja 2018 przez kikosiak Obywatel (1,010 p.)

Tak ma to wyglądać jak rozumiem.

void removeList(struct list_node *list_pointer)
{
    if(NULL!=list_pointer)
    {
            struct list_node *next=list_pointer->next;
            free(list_pointer);
            removeList(next);
    }
    else
        return 0;
}

Jednak nie działa.

komentarz 10 maja 2018 przez Ehlert Ekspert (212,790 p.)
Nie wiem czemu nie działa. Same operacje na liście są bardzo proste. Podałem Ci prawidłowy algorytm.

Nie wiem też co oznacza nie działa. Wysypuje się? Valgrind pokazuje że nie usuwasz pamięci? Dla list po kilkanaście tysięcy elementów pamięć się nie czyści?

Dlaczego dla voida zwracasz zero?
komentarz 10 maja 2018 przez kikosiak Obywatel (1,010 p.)
Program przestaje działać, próbowałem wyświetlać elementy i wygląda tak jakby nie usuwało list_pointer. nie wiem dlaczego.
komentarz 10 maja 2018 przez Ehlert Ekspert (212,790 p.)

Nie korzystając z żadnych funkcji stwórz listę dla 3 elementów.

Potem wywołaj funkcje usuwania rekurencyjnego i debug, debug, debug wink

komentarz 10 maja 2018 przez kikosiak Obywatel (1,010 p.)
Dla zwykłej listy dwukierunkowej by działało, ale z tą cykliczną coś jest nie tak.
komentarz 11 maja 2018 przez j23 Mędrzec (194,920 p.)

To "coś nie tak" to pewnie fakt, że w liście cyklicznej ostatni element wskazuje na pierwszy, a nie, jak zakładasz, next == NULL.

 

Podobne pytania

0 głosów
1 odpowiedź 1,796 wizyt
pytanie zadane 15 kwietnia 2017 w C i C++ przez Lemon Nowicjusz (210 p.)
0 głosów
1 odpowiedź 273 wizyt
0 głosów
1 odpowiedź 339 wizyt
pytanie zadane 16 maja 2016 w C i C++ przez vasiv Użytkownik (590 p.)

92,626 zapytań

141,485 odpowiedzi

319,841 komentarzy

62,006 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!

...