This commit is contained in:
Daniel Zwanzig 2025-05-22 18:35:37 +02:00
parent 7b1b698fd3
commit 8a31953c27
3 changed files with 199 additions and 0 deletions

42
josephus.c Normal file
View File

@ -0,0 +1,42 @@
/*--- #includes ------------------------------------------------------*/
#define _CRT_SECURE_NO_WARNINGS //VC++: keine scanf() Warnungen
#include <stdio.h>
#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;
}

100
queue.c Normal file
View File

@ -0,0 +1,100 @@
/*--- #includes ------------------------------------------------------*/
#include <stdio.h>
#include <stdlib.h>
#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();
}*/

57
queue.h Normal file
View File

@ -0,0 +1,57 @@
#ifndef QUEUE_H
#define QUEUE_H
/*--- #includes ------------------------------------------------------*/
#include <limits.h>
#include <stdio.h>
/*--- #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*/