Implementacja stosu.

2011-10-22 19:21
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?

edytowany 2x, ostatnio: olek1, 2011-10-22 19:33

Pozostało 580 znaków

2011-10-22 20:25
1

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

Pozostało 580 znaków

2011-10-23 09:45
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);
    }
} 
edytowany 1x, ostatnio: olek1, 2011-10-23 09:48

Pozostało 580 znaków

2011-10-23 18:43

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

Pozostało 580 znaków

Liczba odpowiedzi na stronę

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