diff --git a/josephus.c b/josephus.c new file mode 100644 index 0000000..ee6e8a8 --- /dev/null +++ b/josephus.c @@ -0,0 +1,42 @@ +/*--- #includes ------------------------------------------------------*/ +#define _CRT_SECURE_NO_WARNINGS //VC++: keine scanf() Warnungen +#include +#include "queue.h" + +/*--- #defines -------------------------------------------------------*/ + +/*--- Datentypen (typedef) -------------------------------------------*/ + +/*--- Prototypen lokaler Funktionen ----------------------------------*/ + +/*--- main -----------------------------------------------------------*/ +int main(void) +{ + int n, z, i=1, nr; + + do { + printf("Wie viele Personen: "); + nr = scanf("%d", &n); getchar(); + } while (nr != 1 || n < 0); + do { + printf("Wie vielte ist auszusondern: "); + nr = scanf("%d", &z); getchar(); + } while (nr != 1 || z < 0); + + for (i = 1; i <= n; i++) // Queue füllen + put(i); + + while (!isEmpty()) { + for (i = 1; i < z; i++) { // z-1 Zahlen aus Queue lesen + if (put(get()) == FALSE) { // und wieder am Ende der Queue einfügen + fprintf(stderr, "Fehler beim Einfügen\n"); + return 1; + } + } + printf("%d, ", get()); // z. Zahl aus Queue lesen und ausgeben + // Diese Zahl nicht mehr einfügen + } + printf("\n"); + + return 0; +} diff --git a/queue.c b/queue.c new file mode 100644 index 0000000..ada614a --- /dev/null +++ b/queue.c @@ -0,0 +1,100 @@ +/*--- #includes ------------------------------------------------------*/ +#include +#include +#include "queue.h" + +/*--- #defines -------------------------------------------------------*/ + +/*--- Lokale Datentypen (typedef) ------------------------------------*/ + +Jose* head = NULL; +Jose* tail = NULL; + +/*--- Modulglobale static Variablen ----------------------------------*/ + +/*--- Prototypen lokaler Funktionen ----------------------------------*/ + +/*--- Funktionsdefinitionen ------------------------------------------*/ + +/*--------------------------------------------------------------------*\ + * 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) +{ + Jose* j = (Jose*)malloc(sizeof(Jose)); + + if(!j){ + printf("Es kann kein Speicher mehr allokiert werden!"); + return FALSE; + } + + j->value = zahl; + j->next = NULL; + j->prev = tail; + + if(tail) + tail->next = j; + else + head = j; + + tail = j; + return TRUE; +} + +/*--------------------------------------------------------------------*\ + * Auslesen aus Liste + * Parameter: + * keine + * Return Wert: + * Zahl am Anfang der Liste oder aber QLEER, wenn Liste leer ist. + *--------------------------------------------------------------------*/ +int get(void) +{ + int valueHead; + Jose* tmp; + + if(head == NULL) + return QLEER; + + tmp = head; + valueHead = tmp->value; + head = head->next; + + if (head == NULL) { + tail = NULL; + } else { + head->prev = NULL; + } + free(tmp); + return valueHead; +} + +/*--------------------------------------------------------------------*\ + * Pruefen der Liste + * Parameter: + * keine + * Return Wert: + * liefert TRUE, wenn Queue leer ist, sonst FALSE + *--------------------------------------------------------------------*/ +Bool isEmpty(void) +{ + if(head == NULL) + return TRUE; + else + return FALSE; +} + +/*int main(){ + put(69); + put(70); + put(80); + get(); + get(); + get(); + get(); +}*/ \ No newline at end of file diff --git a/queue.h b/queue.h new file mode 100644 index 0000000..02d4887 --- /dev/null +++ b/queue.h @@ -0,0 +1,57 @@ +#ifndef QUEUE_H +#define QUEUE_H + +/*--- #includes ------------------------------------------------------*/ +#include +#include + +/*--- #defines -------------------------------------------------------*/ +#define TRUE 1 +#define FALSE 0 +#define QLEER INT_MIN + +/*--- Datentypen (typedef) -------------------------------------------*/ +typedef int Bool; + +typedef struct Jose { + int value; + struct Jose* next; + struct Jose* prev; +} Jose; + +extern Jose* head; +extern Jose* tail; +/*--- Prototypen globaler Funktionen ---------------------------------*/ + +/*--------------------------------------------------------------------*\ + * 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 + * Hinweis: + * - dynamische Verwaltung von Speicher muss mit malloc() und free() + * durchgeführt werden; dynamische Arrays sind nicht erlaubt !!! + *--------------------------------------------------------------------*/ +Bool put(int zahl); + +/*--------------------------------------------------------------------*\ + * Auslesen aus Liste + * Parameter: + * keine + * Return Wert: + * Zahl am Anfang der Liste oder aber QLEER, wenn Liste leer ist. + *--------------------------------------------------------------------*/ +int get(void); + +/*--------------------------------------------------------------------*\ + * Pruefen der Liste + * Parameter: + * keine + * Return Wert: + * liefert TRUE, wenn Queue leer ist, sonst FALSE + *--------------------------------------------------------------------*/ +Bool isEmpty(void); + +#endif /*QUEUE_H*/