#include<stdio.h>
#include<stdlib.h>
int n=0;
int m;
int i,a;
typedef struct node//结构体node
{
int data;//数字
struct node *next;//指针
}node;
typedef node* Linklist;//链表指针
//原代码void CreatLinklist( Linklist *L,int n)
Linklist CreatLinklist(Linklist *L,int n)//构造链表函数
{
Linklist p,s;
*L=(Linklist)malloc(sizeof(node));//链表大小动态分配空间指针L指向该空间
(*L)->next=NULL;//指针指向尾部
int i=0;
p=*L; //增加这个语句,让p指向当前结点,P是当前结点
if(n!=0)
{
//原代码while(i<=41)
while(i<=n)
{
s=(Linklist)malloc(sizeof(node));//为S申请空间
s->data = i++;//一直向上加直到超过总人数为止
p->next = s;//S是P的尾部
p=s;//S赋给P
}
s->next=(*L)->next;//将链表循环起来;
}
free(*L);//释放头结点;
return s->next;//返回第一个结点的值;
}
void yuesefu();
int main()
{
while(1)
{
printf("约瑟夫报数问题是否开始?1.是 0.退出 其它.重新输入\n");
scanf("%d",&a);
if(a==1)
{
yuesefu();
printf("\n");
while(1)
{
printf("输入数字是否继续?1.是 0或其它.返回上一级菜单~\n");
scanf("%d",&a);
printf("\n");
if(a==1)
{
yuesefu();
printf("\n");
}
else
{
break;
}
}
}
else if(a==0)
{
printf("谢谢使用~\n");
return 0;
}
else
{
}
}
}
void yuesefu()//约瑟夫功能函数用于模拟人员报数以及淘汰
{
printf("用户输入总人数n和报数m:\n");
scanf("%d%d",&n,&m);
printf("总人数n=%d,报数m=%d.\n",n,m);
Linklist L;
//原代码Linklist *p = CreatLinklist(Linklist *L,int n);
Linklist p = CreatLinklist(&L,n);
Linklist temp;
m%=n;//m是正好刚要去掉的那个人的序号
while(p!=p->next)
{
for(i=1;i<m-1;i++)
{
p=p->next;
}
printf("%d->",p->next->data);//输出去掉的那个人
temp=p->next;
p->next=temp->next;
free(temp);//去掉报数正好是m的人这个节点
p=p->next;
}
printf("%d",p->data);//最幸运留到最后的人
}