[ansi C] Stos - zdejmowanie ze zwalnianiem pamieci

Odpowiedz Nowy wątek
2009-01-20 01:24
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.

Pozostało 580 znaków

2009-01-20 05:21
0

Własny stos

Pozostało 580 znaków

2009-01-20 10:55
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);

no to pojechałem z nieobecnością.. chwila przerwy i prawie rok przeleciał

Pozostało 580 znaków

2009-01-20 18:28
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 ;-)

Pozostało 580 znaków

2010-05-31 13:08
Plus
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!

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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