编号为1,2,…,n的n个人按顺时针方向围坐在一张圆桌周围,每人持有一个密码(正整数)。一开始任选一个正整数m作为报数上限值,从第一个人开始按顺时针方向自1开
始报数,报到m时停止报数,报m的那个人出列,将他的密码作为新的m值,从他顺时针方向的下一个人开始重新从1报数,数到m的那个人又出列;如此下去,直至圆桌周围的
人全部出列为止。要求按出列顺序输出n个人的编号。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct lnode
{
int num;
int keyword;
struct lnode *next;
}node;
void create(node **phead, int i, int n)
{
node *p1, *p2, *q;
int mima;
p2 = *phead;
p1 = NULL;
while (p2!= NULL) { //找到需要插入结点的地方
p1 = p2;
p2 = p2->next;
}
q= (node *)malloc(sizeof(node));
printf("enter %d people mima:",i);
scanf("%d",&mima);
q->num =i;
q->keyword=mima;
q->next = p2;
if (p1 == NULL) {
*phead= q;
} else {
p1->next = q; //建立链表
}
if (i == n) {
q->next = *phead;
}
}
void yuesefu(node *head, int x)
{
int i;
node *p, *q;
p=q=head;
while (q->next != q) {
for (i = 1; i < x; i ++) {
p=q;
q=q->next;
}
printf("%d ",q->num);
x=q->keyword;
p->next =q->next; //将报m的人出列
free(q);
q=p->next;
}
printf("%d\n",q->num);
free(q);
}
int main(void)
{
int i, m, n;
node *head;
printf("输入人数及初始密码:");
scanf("%d%d", &n, &m);
for (i = 1,head = NULL;i <= n;i++)
create(&head, i, n);
yuesefu(head, m);
}