Zwalnianie pamięci listy jednokierunkowej (malloc)

0

Nie bardzo wiem w jaki sposób mam zwolnić pamięc dynamicznej listy jednokierunkowej.
Wiem, że potrzebna jest pętla.

http://pastebin.com/FCm9AefG

Jakby ktoś chciał przetestować program, to należy utworzyć plik .txt z jakąś cyfrą, np. 2 + plik tekst.txt, w którym trzeba wpisać jakikolwiek wyraz.

0

Iteracyjnie (pętlą) albo rekurencyjnie
To drugie rozwiązanie jest króciutkie

void zwolnij(struct para *lista){
  if(lista){
    zwolnij(lista->nast);
    free(lista);
  }
}
 
0

hmm...mam dwie listy: glowa i wsk.
funkcja:

void zwolnij(struct para *wsk){
  if(wsk){
    zwolnij(wsk->nast);
    free(wsk);
  }
}

wywołuję zwolnij(wsk); ?
chyba coś robię nie tak.

0

To poślij jeszcze na pastebina jak to wywołujesz, bo powinno działac. Aha, i czy inicjalizujesz ostatni wskaźnik NULLem? Bo to chyba może mieć wpływ

0

dałem wsk = glowa, czyli ustawiłem wskaźnik na początek, potem wywołanie: zwolnij(wsk);
obecny kod: http://pastebin.com/sxNqD3dU

0

Wydaje mi się, że wszystko będzie działać, jeśli przy dodawaniu elementów ostatni element będzie przechowywał wskaźnik na NULL. Bo z tego co widzę, wskaźnik ostatniego elementu jest niezainicjalizowany i może przechowywać śmieci

0

void EmptyTheList(List * plist) {
Node * psave;
while (*plist != NULL) {
psave = (*plist)->next;
free(*plist);
*plist = psave;
}
}

Node to typ wskażnika do listy

0

ostatni element mam zapisany tak: wsk = wsk->nast;
czyli chcę, aby był NULL na ostatnim, więc: wsk = NULL;
następnie cofam na początek: wsk = glowa;
i funkcja dalej się sypie.

0
xpeye napisał(a):

void EmptyTheList(List * plist) {
Node * psave;
while (*plist != NULL) {
psave = (*plist)->next;
free(*plist);
*plist = psave;
}
}

Node to typ wskażnika do listy

a czemu jest (List * plist), zamiast (struct para *wsk)?

0
btanreb napisał(a):

czyli chcę, aby był NULL na ostatnim, więc: wsk = NULL;

Nie tak, wtedy nie masz NULL na końcu listy, tylko zerujesz wsk. Po prostu ostatni węzeł listy w polu nast powinien przechowywać NULL.

0
void zwolnij(struct para *list)
  {
   struct para *del;
   while(list)
     {
      del=list;
      list=del->nast;
      free(del);
     }
  }
0

chyba teraz działa poprawnie: http://pastebin.com/index/CZXswXrC
tylko to zwolniło wsk, a co z glowa?

0

@btanreb
Bez urazy, ale może poczytaj trochę o wskaźnikach. Skoro wsk = glowa to znaczy, że glowa jest tez zwolniona.

0

Ten kod nawet jesli bedzie dzialac poprawnie to jest do odrzucenia.

Poczytaj o funkcjach a potem je zastosuj:

  • lista_inicjuj
  • lista_dodaj
  • lista_zwolnij_wszystko

To jest minimalna lista funkcji dla listy.

0

Teraz po polsku

/* zwalnia pamiec przydzielona przez malloc() i ustawia wskaznik na NULL */
void CzyscListe(Lista * wlista)
{
	Wezel * wsk;
	while (wsk!=wlista->koniec->nast)
	{
		wsk = (wlista->glowny)->nast;	// zapisuje adres wezla
		free(wlista->glowny);		// zwalnia wezel
		wlista->glowny = wsk;		// przechodzi do nastepnego wezla
	}
}

A to typ Wezel

typedef struct wezel
{
   Pozycja pozycja;
   struct wezel * nast;
} Wezel;

1 użytkowników online, w tym zalogowanych: 0, gości: 1