#include<stdio.h>
#include<stdlib.h>
typedef struct s
{
int a;
struct s *next;
}ss; //建立节点
ss*creat(int n) //建立循环链表的函数
{
int i = 1;
ss*head,*p,*s;
head = (ss*)malloc(sizeof(ss));
head->a = 1;
p = head;
while(--n)
{
s = (ss*)malloc(sizeof(ss));
s->a = i+1;
p->next = s;
p = s;
i++;
}
p->next = head; //首尾相连
return(head); //返回“头”指针
}
void print(ss*head,int n,int m,int k) //依次出局函数
{
int j;
int k2 = k;
ss*p,*s;
p = head;
for( ; --m ; s = p , p = p->next); //找到第一次报数的位置
for(j=0;j<n;j++) //循环n次
{
for( ; --k2 ; s = p , p = p->next); //找到报数结束位置
printf("%d ",p->a); //输出出局的人
s->next = p->next;
free(p);
p = s->next; //删除节点,释放内存
k2 = k; //k2依然取到k值,以备下次使用
}
}
main()
{
int n,m,k;
ss*head;
printf("\t\t\t\t***约瑟夫问题***\n\n");
printf("请输入围坐在圆桌周围的人数n:");
scanf("%d",&n);
head = creat(n);
printf("请输入第一次开始报数人的位置m:");
scanf("%d",&m);
printf("你希望报数到第几个数的人出列:");
scanf("%d",&k); //输入参数,n、m、k
printf("出列顺序:");
print(head,n,m,k);
putchar(10);
}
#include<stdlib.h>
typedef struct s
{
int a;
struct s *next;
}ss; //建立节点
ss*creat(int n) //建立循环链表的函数
{
int i = 1;
ss*head,*p,*s;
head = (ss*)malloc(sizeof(ss));
head->a = 1;
p = head;
while(--n)
{
s = (ss*)malloc(sizeof(ss));
s->a = i+1;
p->next = s;
p = s;
i++;
}
p->next = head; //首尾相连
return(head); //返回“头”指针
}
void print(ss*head,int n,int m,int k) //依次出局函数
{
int j;
int k2 = k;
ss*p,*s;
p = head;
for( ; --m ; s = p , p = p->next); //找到第一次报数的位置
for(j=0;j<n;j++) //循环n次
{
for( ; --k2 ; s = p , p = p->next); //找到报数结束位置
printf("%d ",p->a); //输出出局的人
s->next = p->next;
free(p);
p = s->next; //删除节点,释放内存
k2 = k; //k2依然取到k值,以备下次使用
}
}
main()
{
int n,m,k;
ss*head;
printf("\t\t\t\t***约瑟夫问题***\n\n");
printf("请输入围坐在圆桌周围的人数n:");
scanf("%d",&n);
head = creat(n);
printf("请输入第一次开始报数人的位置m:");
scanf("%d",&m);
printf("你希望报数到第几个数的人出列:");
scanf("%d",&k); //输入参数,n、m、k
printf("出列顺序:");
print(head,n,m,k);
putchar(10);
}