约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct Node
{
int num;
struct Node *next;
}LinkList;
LinkList *creat(int n)
{
int i = 1;
LinkList *p,*q,*head;
p = (LinkList*)malloc(sizeof(LinkList));
p->num = i;
head = p;
for(i = 2;i<=n;i++)
{
q = (LinkList*)malloc(sizeof(LinkList));
q->num = i;
p->next = q;
p = q;
//p->next = head;
}
p->next = head;
return head;
}
void fun(LinkList *L,int k,int m)
{
int i,j;
LinkList *p,*q,*s;
p = L;
for(i = 1;i<k;i++)
{
q = p;
p = p->next;
}
while(p->next!=p)
{
for(j = 1;j<m;j++)
{
q=p;
p = p->next;
}
printf("%5d",p->num);
s = p;
q->next = p->next;
p = p->next;
free(s);
}
printf("%5d",p->num);
}
void main()
{
LinkList *L;
int n,k,m;
n = 9;
m = 4;
k = 2;
L=creat(n);
fun(L,k,m);
}