[ansi C] Stos - zdejmowanie ze zwalnianiem pamieci

0

Witam!
Zaimplementowałem stos na liście jednokierunkowej, który potrzebny jest mi do obliczeń wyrażeń ONP.

struct LST {
	double wartosc;
	struct LST *nast;
};

typedef struct LST LISTA;

LISTA * push(double x, LISTA *n) {
	LISTA *p = (LISTA *) malloc(sizeof(LISTA));
	p->nast = n;
	p->wartosc = x;
	return p;
}

double pop (LISTA * n) {
	double wart;
	LISTA *temp;

	wart = n->wartosc;
	temp = n;
	n = n->nast;
	free(temp);
	return wart;
}

Jednak zdejmowanie nie działa tak jak powinno. Prawdę mówiąc, w ogóle nie działa (debuger pokazuje, że to wina free(temp), a bez tego na stosie jest wciąż ta sama liczba). Wcześniej miałem stos zrobiony tak, że element był dodawany na koniec listy, i zdejmowanie polegało tylko na przypisaniu do odpowiedniego wskaźnika NULL. Jednak mój ćwiczeniowiec wymaga, by po ściągnięciu liczby ze stosu, pamięć została zwolniona. Bardzo proszę o pomoc, jutro muszę wysłać na maila gotowy już projekt, i jedynie tego mi brakuje.

Oto moje wcześniejsze funkcje push i pop:

LISTA * push(double x, LISTA *n) {
    if (n->nast == NULL) {
		LISTA *p = (LISTA *) malloc(sizeof(LISTA));
		p->wartosc = x;
		p->nast = n;
		return p;
	}
	else {
		n->nast = push(x, n->nast);
		return n;
	}

double pop (LISTA *n) {
	double wart;
    while (n->nast->nast != NULL)
          n = n->nast;
	wart = n->wartosc;
	n->nast = NULL;
	return wart;
}

Nie wiem, być może wymaga to dopisania jednej linijki, ale już siedzę nad tym projektem cały dzień i dalej nie działa.

0

pop nie dziala tak jak potrzeba, poniewaz przekazujesz do pop'a KOPIE WSKAZNIKA z zewnatrz. po tym jak pop wykona n=n->nast NA ZEWNATRZ POPA WSKAZNIK SIE NIE ZMIENI.

pop musi pobierac wskaznik przez wskaznik aby moc zmienic wartosc wskanzika na zewnatrz:

double pop(LISTA ** wsk)
{ ....
   *n = (*n)->nast;
...
}

LISTA* head;
..
double x = pop( & head);
0
quetzalcoatl napisał(a)

pop nie dziala tak jak potrzeba, poniewaz przekazujesz do pop'a KOPIE WSKAZNIKA z zewnatrz. po tym jak pop wykona n=n->nast NA ZEWNATRZ POPA WSKAZNIK SIE NIE ZMIENI.

pop musi pobierac wskaznik przez wskaznik aby moc zmienic wartosc wskanzika na zewnatrz:

double pop(LISTA ** wsk)
{ ....
   *n = (*n)->nast;
...
}

LISTA* head;
..
double x = pop( & head);

Jasne :-) Teraz wszystko działa. Jednak 1.30 to nie jest dobra pora na kończenie projektu ;-)

0

Siedze od 2h nad tym problemem, wiedzialem ze msuze przekazac wskaznik do wskaznika, ale pojecia nie mialem jak to pozniej wywlolac w programie. Dzieki wielkie za podpowiedz, ja mam ogromna satysfakcje!

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