约瑟夫环
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int no;
unsigned int pwd;
struct node *next;
}Node, *LinkList;
LinkList create_list(int n)
{
LinkList p, rear; int i;
p = (Node *)malloc(sizeof(Node));
if (!p) {
printf("memory allocation error!\n"); return NULL;
}
printf("input password:");
scanf("%d", &(p->pwd));
p->no = 1;
p->next = p;
rear = p;
for (i = 2; i <= n; i++)
{
p = (Node *)malloc(sizeof(Node));
if (!p){
printf("memory allocation error!\n"); return NULL;
}
printf("input password:");
scanf("%d", &(p->pwd));
p->no = i; p->next = rear->next;
rear->next = p; rear = p;
}
return rear;
}
void Joseph(LinkList tail, int n, int m)
{
LinkList pre, p;
int k;
m = m % n ? m % n : n;
pre = tail;
p = tail->next;
k = 1;
while (n > 1)
{
if (k == m)
{
printf("%4d", p->no);
pre->next = p->next; n--;
m = p->pwd % n ? p->pwd % n : n;
free(p);
p = pre->next;
k = 1;
}
else {
k++; pre = p; p = p->next;
}
}
printf( "%4d\n", p->no); free(p);
}
void output_list(LinkList head)
{
LinkList p;
p = head;
do {
printf("(%d,%d)\n", p->no, p->pwd);
p = p->next;
} while (p != head);
printf("\n");
}
int main(void)
{
LinkList tail;
int n, it;
printf("input the number of players and initial password:");
scanf("%d%d", &n, &it);
tail = create_list(n);
if (tail)
{
output_list(tail->next);
Joseph(tail, n, it);
}
system("pause");
return 0;
}