Info2/MA3/queue.c
2025-05-29 20:22:06 +02:00

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;
}
}