/*	queue.c -- Matthias Jauernig, 08.01.04						*/
/*	Implementation einer rudimentären Schlange mit ihren Funktionen			*/

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

/* -- Struktur für ein Queue-Element deklarieren --------------------------------------	*/
typedef struct QUEUE {
	double elem;
	struct QUEUE *next;
} queue;

/* -- empty() -- legt eine leere queue an ---------------------------------------------	*/
inline queue *empty(void){  return NULL;  }
/* -- isempty() -- prüft, ob eine queue leer ist und gibt entsprechenden Wert zurück --	*/
inline char isempty(queue *qe){  return qe?0:1;  }
/* -- head() -- gibt den Wert des Kopfes der queue zurück -----------------------------	*/
double head(queue *qe){
	if(isempty(qe)){
		printf("!! head() -- Schlange ist leer!\n");
		exit(1);
	}else
		return qe->elem;
}
/* -- tail() -- löscht den Kopf, liefert somit die Adresse des nächsten queue-Elements	*/
queue *tail(queue *qe){
	if(isempty(qe)){
		printf("!! tail() -- Schlange ist leer!\n");
		exit(1);
	}else{
		queue *h=qe->next;
		free(qe);
		return h;
	}
}
/* -- append() -- hängt ein Element an die queue an und gibt den aktuellen Kopf zurück	*/
queue *append(double zahl, queue *qe){
	queue *tmp=qe, *h=(queue *)malloc(sizeof(queue));
	h->elem=zahl;
	h->next=NULL;
	if(isempty(tmp))
		return h;
	while(tmp->next)
		tmp=tmp->next;
	tmp->next=h;
	return qe;
}
/* -- freigeben() -- gibt den Speicherplatz der queue wieder frei ---------------------	*/
inline void freigeben(queue *qe){  while(qe)  qe=tail(qe);  }

/* ---- main() ------------------------------------------------------------------------	*/
int main(void){
	queue *qe=empty(); //lege eine neue queue an, qe zeigt stets auf deren Kopf
	double zahl;
	// Testen einiger Aufrufe, um die Korrektheit der Funktionen zu prüfen
	printf(	"Testlauf für die Schlange\n"
		"-------------------------\n\n");
	zahl=18.74536;
	printf("append(%g)...\n", zahl);
	qe=append(zahl, qe);
	printf("head()=%g\n", head(qe));
	printf("tail()...\n");
	qe=tail(qe);
	printf("Schlange ist %sleer!\n", isempty(qe) ? "" : "nicht ");
	zahl=1234.56789;
	printf("append(%g)...\n", zahl);
	qe=append(zahl, qe);
	zahl=-19.2837465;
	printf("append(%g)...\n", zahl);
	qe=append(zahl, qe);
	printf("head()=%g\n", head(qe));
	printf("tail()...\n");
	qe=tail(qe);
	printf("head()=%g\n", head(qe));
	printf("Schlange ist %sleer!\n", isempty(qe) ? "" : "nicht ");

	freigeben(qe);
	return 0;
}
/* Ausgabe für die Testaufrufe in main()
Testlauf für die Schlange
-------------------------

append(18.7454)...
head()=18.7454
tail()...
Schlange ist leer!
append(1234.57)...
append(-19.2837)...
head()=1234.57
tail()...
head()=-19.2837
Schlange ist nicht leer!
*/

