循环链表方式实现,运行结果:
完整代码如下:
#include<stdio.h>
#include <stdlib.h>
#define MAXN 100
typedef struct _data
{
int flag; //标记
char name[30]; //姓名
int index; //序号
struct _data *next;
}Stdata;
void CountOff(int n,int w,int s,Stdata* out);
int main()
{
int i,n,w,s;
Stdata* head=0,*p,*t;
scanf("%d",&n); //读取N
getchar();//吸收回车符
for(i=0;i<n;i++)
{
p = (Stdata*)malloc(sizeof(Stdata));
//读取N个名字,并存如链表
scanf("%s",p->name);
p->flag = 0;
p->index = i+1;
p->next = 0;
if(head==0)
{
head = p;
t=head;
}else
{
t->next = p;
t = p;
}
}
t->next = head; //最后一个节点指向头节点
scanf("%d %d",&w,&s); //读入w和s
CountOff(n,w,s,head);
//释放空间
while(head)
{
p = head->next;
free(head);
head = p;
}
head = 0;
return 0;
}
void CountOff(int n,int w,int s,Stdata* head)
{
int i=1,t=n,k=0;//t表示剩余人数
Stdata* out=head;
//找到第w个位置
while(i<w)
{
out = out->next;
i++;
}
//开始出队
while(t!=1)
{
if(out->flag==0)
{
k++;
if(k%s==0)
{
k = 0;
out->flag=1;
printf("%d %s\n",out->index,out->name);
t--;
}
}
out = out->next;
}
}
循环 链表
这里你首先要知道,链表是啥,而所说的循环又是啥,为什么这样用。
链表,其实就是一个个的节点,然后可以按顺序的依次从第一个节点访问到后面所有的节点,(有序的)
而为什么叫循环链表,其实就是把链表的头和尾连接在一起,只是适应了这里的围成一个圈的场景而已。
至于题目逻辑,无非就是从这个链表中依次按顺序往后取数,直到到达目标,对链表进行删除操作,再到最后的终止条件。
这个题目的重点是你要熟练理解链表是啥,掌握他的增删改查。
先去理解链表,试着练习一下,再回头看这个问题,还有不会,再问