122 lines
4.2 KiB
C
122 lines
4.2 KiB
C
/**********************************************************************\
|
|
* Kurzbeschreibung:
|
|
* queue.c - realisiert eine Queue (Warteschlange)
|
|
*
|
|
* Datum: Autor:
|
|
*
|
|
*
|
|
\**********************************************************************/
|
|
|
|
/*--- #includes ------------------------------------------------------*/
|
|
#include <stdio.h> // Standard Ein-/Ausgabe
|
|
#include <stdlib.h> // Für malloc und free
|
|
#include "queue.h" // Für die Typen und Funktionsdeklarationen
|
|
|
|
/*--- Modulglobale static Variablen ----------------------------------*/
|
|
// Das sind Zeiger auf das erste und letzte Element der Queue.
|
|
// Sie sind nur hier sichtbar (static = nur in dieser Datei).
|
|
static Queue_Elem *Anfang_Element = NULL; // Zeigt auf das erste Element in der Queue
|
|
static Queue_Elem *Ende_Element = NULL; // Zeigt auf das letzte Element in der Queue
|
|
|
|
/*--------------------------------------------------------------------*\
|
|
* Einfuegen in Liste
|
|
* Parameter:
|
|
* zahl fügt die übergebene Zahl 'zahl' am Ende der Liste ein
|
|
* Return Wert:
|
|
* TRUE wenn noch genug Speicherplatz vorhanden
|
|
* FALSE wenn kein Speicherplatz mehr allokiert werden konnte
|
|
*--------------------------------------------------------------------*/
|
|
Bool put(int zahl)
|
|
{
|
|
// Speicherplatz für ein neues Element anfordern
|
|
Queue_Elem* neues_Element = (Queue_Elem*)malloc(sizeof(Queue_Elem));
|
|
|
|
// Prüfen, ob der Speicher angelegt werden konnte
|
|
if (neues_Element == NULL)
|
|
{
|
|
return FALSE; // Fehler, kein Speicher mehr
|
|
}
|
|
else
|
|
{
|
|
neues_Element->wert = zahl; // Wert setzen
|
|
neues_Element->Element_next = NULL; // Nächstes Element gibt es noch nicht
|
|
neues_Element->Element_prev = NULL; // Vorheriges Element gibt es noch nicht
|
|
|
|
// Wenn Queue noch leer ist (erstes Element)
|
|
if (Anfang_Element == NULL)
|
|
{
|
|
Anfang_Element = neues_Element; // Sowohl Anfang als auch Ende zeigen auf das neue Element
|
|
Ende_Element = neues_Element;
|
|
}
|
|
else // Sonst: Am Ende anhängen
|
|
{
|
|
if (Ende_Element != NULL)
|
|
{
|
|
Ende_Element->Element_next = neues_Element; // Das aktuelle Ende zeigt auf das neue Element
|
|
neues_Element->Element_prev = Ende_Element; // Das neue Element weiß, was vorher war
|
|
Ende_Element = neues_Element; // Das neue Element ist jetzt das Ende
|
|
}
|
|
}
|
|
}
|
|
return TRUE; // Hat geklappt!
|
|
}
|
|
|
|
/*--------------------------------------------------------------------*\
|
|
* Auslesen aus Liste
|
|
* Parameter:
|
|
* keine
|
|
* Return Wert:
|
|
* Zahl am Anfang der Liste oder aber QLEER, wenn Liste leer ist.
|
|
*--------------------------------------------------------------------*/
|
|
int get(void)
|
|
{
|
|
int zahl;
|
|
// Zeiger auf das erste Element (wird gleich gelöscht)
|
|
Queue_Elem* temp = Anfang_Element;
|
|
|
|
// Wenn mindestens ein Element in der Queue ist
|
|
if(Anfang_Element != NULL && Ende_Element != NULL)
|
|
{
|
|
zahl = (Anfang_Element)->wert; // Wert des ersten Elements speichern
|
|
|
|
// Wenn es noch mehr als ein Element gibt
|
|
if(Anfang_Element->Element_next != NULL)
|
|
{
|
|
Anfang_Element->Element_next->Element_prev = NULL; // Das neue Erste zeigt auf nix vorher
|
|
Anfang_Element = Anfang_Element->Element_next; // Anfang_Element zeigt jetzt auf das neue Erste
|
|
}
|
|
else // Es gibt nur ein Element (das wird jetzt gelöscht)
|
|
{
|
|
Anfang_Element = NULL;
|
|
Ende_Element = NULL;
|
|
}
|
|
|
|
free(temp); // Speicherplatz freigeben
|
|
}
|
|
else // Die Queue ist leer
|
|
{
|
|
zahl = QLEER; // Rückgabewert für "leer"
|
|
}
|
|
|
|
return zahl; // Zahl oder QLEER zurückgeben
|
|
}
|
|
|
|
/*--------------------------------------------------------------------*\
|
|
* Pruefen der Liste
|
|
* Parameter:
|
|
* keine
|
|
* Return Wert:
|
|
* liefert TRUE, wenn Queue leer ist, sonst FALSE
|
|
*--------------------------------------------------------------------*/
|
|
Bool isEmpty(void)
|
|
{
|
|
// Ist Anfang und Ende auf NULL -> Queue ist leer
|
|
if(Anfang_Element == NULL && Ende_Element == NULL)
|
|
{
|
|
return TRUE;
|
|
}
|
|
else
|
|
{
|
|
return FALSE;
|
|
}
|
|
} |