约瑟夫问题(循环链表)

来源:互联网 发布:阿里云仓 编辑:程序博客网 时间:2024/05/23 19:16
#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);
}