题目描述
有N个小孩围成一圈,给他们从1开始依次编号,现指定从第W个开始报数,报到第S个时,该小孩出列,然后从下一个小孩开始报数,仍是报到S个出列,如此重复下去,直到所有的小孩都出列(总人数不足S个时将循环报数),求小孩出列的顺序。
输入
第一行输入小孩的人数N(N<=64)
接下来每行输入一个小孩的名字(人名不超过15个字符)
最后一行输入W,S (W < N),用逗号","间隔
接下来每行输入一个小孩的名字(人名不超过15个字符)
最后一行输入W,S (W < N),用逗号","间隔
输出
按人名输出小孩按顺序出列的顺序,每行输出一个人名
样例输入
5
Xiaoming
Xiaohua
Xiaowang
Zhangsan
Lisi
2,3
样例输出
Zhangsan
Xiaohua
Xiaoming
Xiaowang
Lisi
#include<iostream>
using namespace std;
struct cirnode
{
string data;
cirnode*link;
};
class cirlist
{
protected:
cirnode*first,*last;
public:
cirlist()
{
first=last=NULL;
}
cirnode*locate(int i)
{
if(i<0)return NULL;
cirnode*p=first;
int k=1;
while(p!=NULL&&k<i)
{
p=p->link;
k++;
}
return p;
}
bool insert(string&x)
{
cirnode*newnode=new cirnode;
if(newnode==NULL)return false;
if(first==NULL)
{
newnode->data=x;
first=last=newnode;
last->link=first;
return true;
}
else
{
newnode->data=x;
newnode->link=last->link;
last->link=newnode;
last=last->link;
return true;
}
}
};
int main()
{
cirlist child;
int n,w,s,nn,j;
char c;
cin>>n;
nn=n;
while(n--)
{
string name;
cin>>name;
child.insert(name);
}
cin>>w>>c>>s;
cirnode*p=child.locate(w),*pre=NULL;
while(nn--)
{
for(j=1;j<s;j++)
{
pre=p;
p=p->link;
}
cout<<p->data<<endl;
pre->link=p->link;
delete p;
p=pre->link;
}
return 0;
}