实验任务
一条队列呈一字型排列,每次会让其中的一个的离开。
数据输入
第一行 N,代表有几个人。(N <= 1000)(人的编号为 1,2…N)
接下来 N 行,每行包含一个数字 Name,a,b,表示编号为 a 的人名为 Name,
前方为编号为 b 的人。(若前方无人,b 为 0)(姓名长度不超过 10)
接下来为 M,代表离队 M 次。
接下来 M 行,每行包含一个数字 k,表示从队首数第 k 人离队。
(k 不超过队伍长度)
数据输出
从队首开始输出姓名。
输入示例
3
C 2 3
B 3 1
A 1 0
1
3
输出示例
A
B
解题思路
用数组来模拟链表操作。
“前驱后继”的思想。
参考代码
#include <stdio.h>
#include <string.h>
const int maxn = 1010;
struct P{
char name[15];
int l,r;
}que[maxn];
int main()
{
int n,i,j,a,b,m,t,p;
char s[15];
while (~scanf("%d",&n)){
for (i = 0;i < n;i++){
scanf("%s %d %d",s,&a,&b);
que[a].l = b,que[b].r = a; //a的左边(l)是b,b的右边(r)是a
strcpy(que[a].name,s);
if (b == 0) //找到起始位置
p = a;
}
scanf("%d",&m);
int v = 0;
for (i = 0;i < m;i++){
scanf("%d",&t);
if (t == 0){ //从开头第0个人出队,即没人出队
v++;
continue;
}
for (j = 1;j < t;j++)
p = que[p].r;
que[que[p].l].r = que[p].r;
que[que[p].r].l = que[p].l;
que[p].r = que[p].l = -1; //-1不可能是编号,故用-1给出队的人做个标记
for (j = 1;j <= n;j++) //找到队伍开头
if (!que[j].l){
p = j;
break;
}
}
for (i = 1;i <= n-m+v;i++){
printf("%s\n",que[p].name);
p = que[p].r;
}
}
return 0;
}