其实这道题用数组比较简单。不过为了更熟悉一些链表的操作,创建一个环状链表出来,直接模拟小孩数数出列的情况。
题目链接:http://poj.org/problem?id=3750
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
struct node {
char name[20];
node* next;
};
//递归生成链表
node* creatnode(int n) {
if (n == 0)return NULL;
node* p=new node;
cin >> p->name;
p->next = creatnode(n - 1);
return p;
}
int main()
{
int n,w,s;
while (cin >> n) {
node* head, * p0, * p, * q,*temp;
head = creatnode(n);
q = p = p0 = head;
//形成环状链表:
while (true) {
if (p0->next == NULL) { p0->next = head; break; };
p0 = p0->next;
}
char c[4];
cin >> c;
w = c[0] - '0', s = c[2] - '0';
//找到开始的位置:
for (int i = 0; i < w-1; i++) {
p = p->next;
if (i != 0)q = q->next;
}
//当从1开始数数的时候无法让p,q,一前一后。所以用这个方法
int flag=1;
for (int i = 0; i < n; i++) {
if(w-1==0&&i==0) flag=0;
for (int j = 0; j < s - 1; j++) {
p = p->next;
if(flag)q = q->next;
flag=1;
}
cout << p->name << endl;//当前出列
temp = p->next;
delete p;
p=temp;
q->next = p;
}
}
return 0;
}