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

lista cykliczna rekurencja

Cloud VPS
0 głosów
456 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 (215,050 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 (215,050 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 (215,050 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 (215,050 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 (195,240 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,978 wizyt
pytanie zadane 15 kwietnia 2017 w C i C++ przez Lemon Nowicjusz (210 p.)
0 głosów
1 odpowiedź 402 wizyt
0 głosów
1 odpowiedź 540 wizyt
pytanie zadane 16 maja 2016 w C i C++ przez vasiv Użytkownik (590 p.)

93,487 zapytań

142,423 odpowiedzi

322,773 komentarzy

62,908 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

Kursy INF.02 i INF.03
...