问题描述:设编号为1,2,…,n(n>0)个人按顺时针方向围坐-圈,每人持有一个正整数密码。
开始时任意给出一个报数上限值m从第一个人开始顺时针方向自1起顺序报数。
报到m时停止报数,报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人起重新自1起顺序报数.
如此下去,直到所有人全部出列为止。要求设计一个程序模拟此过程,并给出出列人的编号序列。
测试数据:n=7,7个人的密码依次为3,1,7,2,4,8,4 初始报数上限值m=20
正确的顺序:6,1,4,7,2,3,5
#include <stdio.h>
#include <malloc.h>
struct llist
{
int number;//编号
int psw;//密码
struct llist *next;
};
typedef struct llist node;
typedef node *llink;
// llink CreateList(int total)
// {
// llink newNode;
// llink before,firstNode;
// int i;
//
// firstNode = (llink)malloc(sizeof(node));
// if(!firstNode)
// return firstNode;
// firstNode->number = 1;
// printf("请输入第1个人的密码:");
// scanf("%d",&firstNode->psw);
// firstNode->next = NULL;
// before = firstNode;
//
// for (i=2;i<=total;i++)
// {
// newNode = (llink)malloc(sizeof(node));
// if(!newNode)
// return NULL;
// newNode->number = i;
// printf("请输入第%d个人的密码:",i);
// scanf("%d",&newNode->psw);
// newNode->next = NULL;
// before->next = newNode;
// newNode = before;
// }
// newNode->next = firstNode;
// return firstNode;
// }
llink CreateList(int total)
{
llink newNode;
llink before,firstNode;
int i;
firstNode = before = (llink)malloc(sizeof(node));
if(!before)
return before;
before->number = 1;
printf("请输入第1个人的密码:");
scanf("%d",&before->psw);
for (i=2;i<=total;i++)
{
newNode = (llink)malloc(sizeof(node));
if(!newNode)
return NULL;
newNode->number = i;
printf("请输入第%d个人的密码:",i);
scanf("%d",&newNode->psw);
before->next = newNode;
before = newNode;
}
before->next = firstNode;
return firstNode;
}
void JosePush(llink L)
{
int i,m;
llink p,q,s;
p = L;
printf("请输入初始密码:");
scanf("%d",&m);
printf("出列顺序为:");
while(p->next != p)
{
for (i=1;i<m;i++)
{
q = p;
p = p->next;
}
printf("%5d",p->number);
m = p->psw;
s = p;
q->next = p->next;
p = p->next;
free(s);
}
printf("%5d",p->number);
printf("\n");
}
void main()
{
llink L;
int n;
printf("实验人数:");
scanf("%d",&n);
L = CreateList(n);
JosePush(L);
}