有N个人围成一圈,给他们从1开始依次编号,现指定从第W个开始报数,报到第S个时,该人出列,然后从下一个人开始报数,仍是报到S个出列,如此重复下去,直到所有的人都出列(总人数不足S个时将循环报数),求出列的顺序 输入:第一行输入人数N(N<=64),接下来每行输入一个人名 (人名不超过15个字符) ,最后一行输入W,S (W < N),用空格间隔 输出:按出列的顺序输出序号和人名,每行输出一条数据
#include <stdio.h>
#include <stdlib.h>
typedef struct node{
char name[16];
struct node *next;
}
LinkList create(){
LinkList h,r,s;
char name[16];
int N,i;
h=(LinkList)malloc(sizeof(Node));
r=h;
printf("请输入人数:");
scanf("%d",&N);
fflush(stdin); //清空键盘缓冲区,stdin是指标准输入设备的名字,这里指键盘
printf("请输入%d个姓名:\n",N);
for(i=1;i<=N;i++){
s=(LinkList)malloc(sizeof(Node));
gets(s->name);
r->next=s;
r=s;
}fflush(stdin);
r->next=h->next; //最后一个结点的next域指向实际第一个结点,建立循环链表
return h;
}void numberOff(LinkList h,LinkList tail){
int W,S,i,count=1;
LinkList p=h->next,q=tail,r; //q的初值应为最后一个数据结点
printf("请输入W和S:");
scanf("%d%d",&W,&S);
fflush(stdin);
i=1;
while(i<w){
q=p;
p=p->next;
i++;
} //p指向第W个数据结点,q为其前导
while(p!=p->next){ //当循环链表中只剩一个数据结点时结束循环
i=1;
while(i<S){
q=p;
p=p->next;
i++;
}q->next=p->next; //删除p所指结点
r=p;
p=p->next;
printf("第%d个出列:%s\n",count,r->name);
count++;
free(r);
}printf("第%d个出列:%s\n",count,p->name);
free(p);
free(h);
}int main(){
LinkList head,p;
head=create();
p=head->next;
while(p->next!=head->next){
puts(p->name); //输出测试链表建立是否正确,注意循环链表最后一个结点在循环外处理
p=p->next; //得到链表最后一个数据结点的地址
}puts(p->name);
numberOff(head,p)
return 0;
}