Kolejka na wskaźnikach - nie działa

0

Witam
Postanowiłem w ramach poćwiczenia wskaźników i przygotowania do implementacji listy zaimplementować sobie stos i kolejkę, stos mi działa, kolejka nie.

Program jest taki, że nie wiem jak ustawić head -> prev na drugi element w kolejce i w czasie usuwania pierwszego elementu w kolejce znowu ustawić go na nowy drugi element. Może są jeszcze jakieś błędy, proszę was o rzucenie na to okiem i poprawienie nowicjusza.

'+' dodaje liczbę do kolejki, '-' usuwa liczbę z kolejki i ją wypisuje.

Sorry za angielskie komentarze, ale to jest mój sposób praktykę języka.

Mój kod:

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

int i;

struct elem
{
	int value; 
	struct elem *prev; // prev points to the previous element in queue
} *tail = NULL, *head = NULL; // head points to the first element in queue
							  // tail points to the last element in queue

void enqueue(int value)
{
	struct elem *new_elem = (struct elem*)malloc(sizeof(struct elem)); // allocating memory for new element
	new_elem -> prev = tail;
	new_elem -> value = value;
	if(head == NULL) head = new_elem;
	tail = new_elem; // tail points to new (last) element
}

int dequeue()
{
	struct elem *old_elem = head; // head and old_elem point to the first element in queue
	head = head -> prev; 
	int value = old_elem -> value; // temporary value to return
	free(old_elem);
	return value;
}

int main()
{
	char sign; // decides what to do with the queue
	int value; 

	while(~scanf("%c", &sign))
	{
		if(sign == '+') // adding new element to queue
		{
			scanf("%d", &value);
			enqueue(value); 
			printf("OK\n");
		}
		else if(sign == '-') // removing first element in queue
		{
			if(head != NULL) printf("%d\n", dequeue()); // while queue is not empty
			else printf("BLAD\n");
		}
	}

	return 0;
}
0

ja bym dal cos takiego, bez zbytniego myslenia i kombinowania, na pewno mozna poprawic moja funkcje pod wzgledem czytelnosci. Patrząc na moj kod pomysl, gdzie miales błąd, najlepiej rozpisz sobie na kartce kolejne kroki u siebie i u mnie

void enqueue(int value)
{
        struct elem *new_elem = (struct elem*)malloc(sizeof(struct elem)); // allocating memory for new element
        new_elem -> value = value;
	new_elem -> prev = NULL;
	 if(head == NULL){
		head = new_elem;
		tail = new_elem;
		return;
	 }
        tail -> prev = new_elem;
        tail = new_elem; // tail points to new (last) element
}

reszta bez zmian

0

Dzięki, teraz wszystko działa.

Namieszałem przy ustawianiu wskaźnika na kolejny element w kolejce, teraz jest poprawnie.

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