//问题描述:编号是1,2,……,n(n>0)的n个人按照顺序时针方向围坐一圈,
//每个人持有一个正整数密码。开始时任选一个正整数作为报数上限值m,
//从某个人开始按顺时针方向自1开始顺序报数,报到m时停止报数,报m的人出列
//将他的密码作为新的m值,从他在顺时针方向的下一个人开始重新从1报数,如此下去
//直到所有人全部出列为止。设计一个程序来求出出列顺序,并输出结果。
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef struct Node
{
int num,cipher;//num编号,cipher密码
struct Node *next;
}*LinkList;
LinkList creat(int n);//创建链表
void select(LinkList list,int m);
int main()
{
int n,m;
LinkList list;
printf("请输入人数:\n");
scanf("%d",&n);
printf("请输入初始报数的最大值:\n");
scanf("%d",&m);
list=creat(n);
select(list,m);
return 0;
}
LinkList creat(int n)
{
int k,idx=1;
LinkList list;
struct Node *r,*p;
p=(struct Node*)malloc(sizeof(struct Node));
if(p==NULL)
{
printf("系统溢出错误!\n");
exit(1);
}
list=p;
p->num=1;
printf("输入第%d个人的密码:\n",idx++);
scanf("%d",&p->cipher);
r=p;
p->next=p;
for(k=2;k<=n;k++)
{
p=(struct Node*)malloc(sizeof(struct Node));
p->num=k;
printf("输入第%d个人的密码:\n",idx++);
scanf("%d",&p->cipher);
r->next=p;
r=p;
}
p->next=list;
return (list);
}
void select(LinkList list,int m)
{
struct Node *p;
while(1)
{
if(list->next==list)
{
printf("出列的序号为: %d,密码是:%d\n",list->num,list->cipher);
free(list);
return ;
}
while(--m>0)
list=list->next;
printf("出列的序号为:%d,密码是:%d\n",list->num,list->cipher);
m=list->cipher;
p=list->next;
list->next=p->next;
list->num=p->num;
list->cipher=p->cipher;
free(p);
}
}
算法——约瑟夫环问题
最新推荐文章于 2024-05-29 18:31:09 发布