有N个小朋友围成一圈玩击鼓传花游戏,将小朋友编号为1~N,从1号开始传花,每次传3个,拿到花的小朋友表演节目后退出,扔给后一位没有表演的同学,求同学们的表演次序?
例如:5个小朋友,从1号开始传花,第一个表演的是3号,第二个表演的是1号,第三个表演的是5号,第四个表演的是2号,最后一个表演的是4号。(建议用链表实现)
#include<stdio.h>
#include<stdlib.h>
typedef struct Node{
int Element; //存储玩家序号
struct Node* next; //next指针
int visited; //标记该结点是否被访问
}Lnode,*LinkList;
Lnode *p, *L,*r,*s;
int i,n;
/*尾插法建立不带头节点的循环单链表*/
LinkList TailCreate(LinkList &L,int n)
{
L=(LinkList)malloc(sizeof(Lnode));
L->next=L;
L->visited=0;
printf("请输入这%d学生序号:",n);
scanf("%d",&L->Element);
r=L;
for(i=0;i<n-1;i++)
{
s=(LinkList)malloc(sizeof(Lnode));
scanf("%d",&s->Element);
s->visited=0;
r->next=s;
r=s;
}
r->next=L;
return L;
}
/*进行结果判断输出*/
void Judge(LinkList &L,int n)
{
printf("%d位同学表演次序为:",n);
p=L;
int sum=1,x=0; //sum用来判断传花次数,x用来记录表演次数
while(x<n){
if(p->visited==0) //如果该结点没有被访问过
{
if(sum%3!=0){ //并且传花次数不足3次,则继续传花,并使传花次数+1
p=p->next;
sum++;
}
if(sum%3==0&&p->visited==0) //传花次数等于3并且该同学没有表演过
{
p->visited=1; //该同学表演
sum=1; //同时传花次数+1
x++; //表演次数+1
printf("%d ",p->Element); //输出本次表演同学的序号
}
}
if(p->visited==1) //如果该同学表演过,则继续后移传花,但传花次数不增加(逻辑删除该结点)
{
p=p->next;
}
}
}
int main(){
printf("请输入学生人数:");
scanf("%d",&n);
TailCreate(L,n);
Judge(L,n);
printf("\n");
system("pause");
return 0;
}