数组的方式
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int ring_sz;
int num;
int *j_ring = NULL;
int *p;
int total_out = 0;
int count = 1;
printf("Please input Josephus ring size:");
scanf("%d", &ring_sz);
printf("\n");
printf("Please input number to exit:");
scanf("%d", &num);
if (ring_sz <= 0 || num <= 0) {
printf("invalid input\n");
return -1;
}
// allocate buffer for ring
j_ring = malloc(sizeof(int) * ring_sz);
p = j_ring;
// initialize the ring
for (int i = 0; i < ring_sz; i++) {
*p++ = i + 1;
}
p = j_ring;
while(total_out != ring_sz) {
if (*p != 0 && count == num) {
printf(" %d", *p);
*p = 0; // marked as this has exited
count = 1; // count from start again
total_out++; // accumulate how many has exited
}
else if (*p != 0) {
count++;
}
p++;
if (p >= j_ring + ring_sz)
p = j_ring;
}
free(j_ring);
return 0;
}
循环链表的形式
#include <stdio.h>
#include <stdlib.h>
typedef struct node Node;
struct node {
int key;
Node *next;
};
Node *create_j_ring(int ring_sz)
{
Node *j_head = NULL;
Node *p;
Node *p_prev;
int i = 0;
while (i++ < ring_sz) {
p = (Node *)malloc(sizeof(struct node));
p->key = i;
p->next = NULL;
if (!j_head) {
j_head = p;
}
else {
p_prev->next = p;
}
p_prev = p;
}
p->next = j_head;
return j_head;
}
void exit_j_ring(Node *j_ring, int num)
{
Node *p, *prev;
Node *piter;
int count = 1;
p = j_ring;
while(p->next != j_ring) {
p = p->next;
}
prev = p;
piter = j_ring;
while (piter) {
if (count == num) {
prev->next = piter->next;
printf(" %d", piter->key);
free(piter);
// last node has exited
if (piter != prev)
piter = prev->next;
else
piter = NULL;
count = 1;
}
else {
prev = piter;
piter = piter->next;
count++;
}
}
}
void dump_j_ring(Node *j_ring, int size)
{
for (int i = 0; i < size; i++) {
printf(" %d", j_ring->key);
j_ring = j_ring->next;
}
printf("\n");
}
int main(void)
{
int ring_sz;
int num;
Node *j_ring = NULL;
printf("Please input Josephus ring size:");
scanf("%d", &ring_sz);
printf("\n");
printf("Please input number to exit:");
scanf("%d", &num);
if (ring_sz <= 0 || num <= 0) {
printf("invalid input\n");
return -1;
}
j_ring = create_j_ring(ring_sz);
dump_j_ring(j_ring, ring_sz);
exit_j_ring(j_ring, num);
}