問題描述:設編號爲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);
}