约瑟夫环 循环链表 contest 4

1573: Math two

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 71  Solved: 27
[Submit][Status][Web Board]

Description

有N个小孩围成一圈,给他们从1开始依次编号,现指定从第W个开始报数,报到第S个时,该小孩出列,然后从下一个小孩开始报数,仍是报到S个出列,如此重复下去,直到所有的小孩都出列(总人数不足S个时将循环报数),求小孩出列的顺序。

Input

第一行输入小孩的人数N(N<=64) 
接下来每行输入一个小孩的名字(人名不超过15个字符) 
最后一行输入W,S (W < N),用逗号","间隔

Output

按人名输出小孩按顺序出列的顺序,每行输出一个人名

Sample Input

5 Xiaoming Xiaohua Xiaowang Zhangsan Lisi 2,3

Sample Output

Zhangsan Xiaohua Xiaoming Xiaowang Lisi

HINT

#include <stdio.h>
#include
<string.h>
#include
<stdlib.h>

struct node
{
int num;
char name[50];
node
*next;
};

void print(node *l )
{

//l = l->next;
while(l)
{
printf(
"%s\n", l->name);
l
= l->next;
}
}

int main( )
{
int N, w, n, i, j;
struct node *head, *p, *q, *l;
while (scanf("%d",&N) != EOF )
{


head
= p = new node;
head
->next = NULL;
p
->next = NULL;
if ( N )
scanf(
"%s",p->name); //刚开始头节点为空。循环时出错
for (i = 0; i < N -1; i++) {
l
= new node;
scanf(
"%s",l->name);
l
->next = NULL;
p
->next = l;
p
= l;
}
p
->next = head;
scanf(
"%d,%d",&w, &n); //此处改错误改了好久
p = head;
for(i = 0; i < w-1; i++)
q
= p, p = p->next;
// printf("2q:%s %s\n",q->name, p->name);
j = 0;
while( p->next != p )
{

for (i = 0; i < n-1 ; i++) {
q
= p, p = p->next;
}
printf(
"%s\n",p->name);
free(p);
q
->next = p->next;
p
= q->next;


}
printf(
"%s\n",p->name);
free(p);

}
return 0;
}

posted on 2011-08-04 07:03  more think, more gains  阅读(167)  评论(0编辑  收藏  举报

导航