Implementacja stosu.

0

Witam. Chciałem sobie napisać implementację stosu w języku C. Otrzymałem coś takiego:

#include<stdio.h>
#include<ctype.h>
#include<string.h>
#include<stdlib.h>
#include<errno.h>
#include<time.h>

void menu();
void push(int x, struct stos *y);
void pop(int x, struct stos *y);

struct stos
{
    int dana;
    struct stos *nast;
};

int main(void)
{
    char wybor;
    int n;
    struct stos *biezacy = NULL;

    menu();
    while ((wybor = getchar()) != 'Q')
    {
        if (wybor == '\n')
            continue;
        switch (wybor)
        {
        case '1' :
            {
            puts("Podaj wartosc jaka ma zostac odlozona na stos");
            scanf("%d", &n);
            push(n, biezacy);
            break;
            }
        case '2' :
            {
                pop(n, biezacy);
                break;
            }
        case 'C' :
            {
                system("cls");
                break;
            }
        case 'M' :
            {
                menu();
                break;
            }
        default :
            {
                puts("Nie wybrales zadnej z dostepnych opcji, sprobj jeszcze raz");
                break;
            }
        }
    }
    getchar();
    getchar();
    return 0;
}

void menu()
{
    puts("1 - odloz na stos");
    puts("2 - zdejmji ze stosu");
    puts("C - wyczysc ekran");
    puts("M - pokaz menu");
    puts("Q - koniec");
}

void push(int x, struct stos *y)
{
    struct stos *nowy;

    if ((nowy = (struct stos*) malloc(sizeof(struct stos))) == NULL)
    {
        puts("Blad przydzilu pamieci");
        exit(EXIT_FAILURE);
    }
    else
    {
        nowy->dana = x;
        nowy->nast = y;
        y = nowy;
        free(nowy);
        printf("Wartosc %d odlozona na stos\n", x);
    }
}

void pop(int x, struct stos *y)
{
    struct stos *poprzedni;

    if (y == NULL)
        puts("Stos jest pusty");
    else
    {
        poprzedni = y->nast;
        free(y);
        y = poprzedni;
        printf("Wartosc %d odlozona ze stosu", x);
    }
} 

Niestety program nie działa tak jak tego oczekuję. Mianowicie wciskając 1 niby wartości odkładają się na stos. Niby bo chyba jednak coś zrobiłem źle i nie odkłada się nic i cały czas wskaźnik bieżący jest równy NULL. Twierdzą tak na podstawie tego, że podczas uruchomienia funkcji pop wypisuje mi zawsze, żę stos jest pusty, mimo tego iż wcześniej odłożyłem niby kilka wartości na stos. Więc coś jest źle tylko nie wiem bardzo, w którym momencie popełniłem błąd. Czy może mi ktoś pomóc. Prosiłbym jeszcze jeśli ktoś gdzieś widział implementację stosu w języku C o podanie takowego źródła. Poza tym jeszcze mam jedno pytanie. W Pascalu była taka funkcja memavail, dzięki której mogłem sobie sprawdzić ile mam wolnej pamięci. Jaki jest jej odpowiednik w języku C, o ile w ogóle takowy istnieje?

1

Nigdzie nie zmieniasz wartości biezacy. No i w funkcji push rozwalasz za każdym razem nowo powstałą strukturę.

0
iooi napisał(a)

Nigdzie nie zmieniasz wartości biezacy. No i w funkcji push rozwalasz za każdym razem nowo powstałą strukturę.

Dzięki, nie wiem po co w push używałem tego free. Mam jeszcze jedno pytanie. Czy istnieje w C odpowiednik Pascalowgo memavail, czyli funkcja, która wyświetla nam stan pamięci?

#include<stdio.h>
#include<ctype.h>
#include<string.h>
#include<stdlib.h>
#include<errno.h>
#include<time.h>

void menu();
void push(int x, struct stos **y);
void pop(int *x, struct stos **y);

struct stos
{
    int dana;
    struct stos *nast;
};

int main(void)
{
    char wybor;
    int n;
    struct stos *biezacy = NULL;

    menu();
    while ((wybor = getchar()) != 'Q')
    {
        if (wybor == '\n')
            continue;
        switch (wybor)
        {
        case '1' :
            {
            puts("Podaj wartosc jaka ma zostac odlozona na stos");
            scanf("%d", &n);
            push(n, &biezacy);
            break;
            }
        case '2' :
            {
                pop(&n, &biezacy);
                break;
            }
        case 'C' :
            {
                system("cls");
                break;
            }
        case 'M' :
            {
                menu();
                break;
            }
        default :
            {
                puts("Nie wybrales zadnej z dostepnych opcji, sprobj jeszcze raz");
                break;
            }
        }
    }
    getchar();
    getchar();
    return 0;
}

void menu()
{
    puts("1 - odloz na stos");
    puts("2 - zdejmji ze stosu");
    puts("C - wyczysc ekran");
    puts("M - pokaz menu");
    puts("Q - koniec");
}

void push(int x, struct stos **y)
{
    struct stos *nowy;

    if ((nowy = (struct stos*) malloc(sizeof(struct stos))) == NULL)
    {
        puts("Blad przydzilu pamieci");
        exit(EXIT_FAILURE);
    }
    else
    {
        nowy->dana = x;
        nowy->nast = *y;
        *y = nowy;
        printf("Wartosc %d odlozona na stos\n", x);
    }
}

void pop(int *x, struct stos **y)
{
    struct stos *poprzedni;

    if (*y == NULL)
        puts("Stos jest pusty");
    else
    {
        poprzedni = *y;
        *y = poprzedni->nast;
        *x = poprzedni->dana;
        free(poprzedni);
        printf("Wartosc %d odlozona ze stosu\n", *x);
    }
} 
1

Nie ma takiej funkcji ani w C, ani w C++.
Na win masz np. coś takiego: http://msdn.microsoft.com/en-[...]rary/aa366589%28VS.85%29.aspx

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