Kolejka (c)

0

Witam
Napisałem kolejkę w strict c, ma być w niej jedynie opcja dodawania i usuwania elementów. Jak się doda element do kolejki to ma wypisać OK, jak usunie, to ma wypisać element, który został usunięty, jak nie ma co usuwać (kolejka pusta) to ma wyświetlić błąd.

Mój problem polega na tym, że wszystko działa, dopóki nie dojdzie się do pustej kolejki (do napisu BLAD), na początku można dodawać, usuwać, ale jak się usunie za dużo i dojdzie do błędu to potem mimo dodawania nowych elementów ciągle będzie przy usuwaniu wyskakiwał błąd. Jest już późno i chciałbym to skończyć, więc mógłby ktoś znaleźć błąd w moim kodzie? byłbym wdzięczny.

#include <stdio.h>
#include <stdlib.h>

struct kolejka
{
	int dane;
	kolejka *ref;
};

kolejka *pointer = NULL; ;
kolejka *tmp = NULL; ;
kolejka *first = NULL; ;

void push(int dane)
{
	tmp = (struct kolejka*)malloc(sizeof(struct kolejka));
	(*tmp).dane = dane;
	if(pointer == NULL) first = tmp; 
	else (*pointer).ref = tmp; //bądź pointer->ref
	tmp -> ref = NULL; //przykładowy
	pointer = tmp;
}

void pop()
{
	if (first != NULL)
	{
		tmp = (*first).ref;
		printf("%d\n", (*first).dane);
		free(first);
		first = tmp;
	}
	else printf("BLAD\n");
}

int main()
{
	int dane;
	char przelacznik;

	while(~scanf("%c", &przelacznik))
	{
		if(przelacznik == '+')
		{
			scanf("%d", &dane);
			push(dane);
			printf("OK\n");
		}
		if(przelacznik == '-') 
		{
			if(first != NULL) pop();
			else printf("BLAD\n");
		}
	}

	return 0;
} 
1

Poprawiona funkcja pop():

void pop()
{
        if (first != NULL)
        {
                tmp = (*first).ref;
                printf("%d\n", (*first).dane);
                free(first);
                first = tmp;
                if(first==NULL)
                        pointer = NULL;
        }
        else printf("BLAD\n");
}

Twoim problemem było nienullowanie wskaźnika pointer (wskazującego na koniec kolejki) po usunięciu ostatniego elementu. Przez to first nigdy nie był przestawiany z NULLa na poczatek kolejki ( funkcja push zachowywała się, jak gdybyś dodawał element do kolejki z istniejącymi elementami).

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