/**********************************************************************\ * Kurzbeschreibung: * queue.c - realisiert eine Queue (Warteschlange) * * Datum: Autor: * * \**********************************************************************/ /*--- #includes ------------------------------------------------------*/ #include // Standard Ein-/Ausgabe #include // 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; } }