#include<stdio.h>
#include<stdlib.h>
typedef struct RLink{
int id;
struct RLink* next;
}rlink;
rlink* initLink(int n)//创建循环链表
{
rlink* p=(rlink*)malloc(sizeof(rlink));//头结点
rlink* temp=p;
rlink* t;
for(int i=1;i<=n;i++)
{
t=(rlink*)malloc(sizeof(rlink));
t->id=i;
t->next=NULL;
temp->next=t;
temp=temp->next;
}
temp->next=p;
return p;
}
void display(rlink* p)
{
rlink* temp=p;
printf(“链表现状:”);
while(temp->next!=p)
{
temp=temp->next;
printf("%d “,temp->id);
}
printf(”\n");
}
void delNode(rlink* p,int id)
{
rlink* temp=p;
rlink* front;
while(temp->id!=id)
{
front=temp;
temp=temp->next;
}
front->next=temp->next;
free(temp);
printf(“删除节点%d \n”,id);
display§;
}
int main()
{
int n,m,k,count;
scanf("%d %d %d",&n,&m,&k);
rlink* p=initLink(n);//创建循环链表,带有头结点
display§;
rlink* temp=p;
rlink* t;
for(int i=1;i<=k;i++)
{
temp=temp->next;
}//找到第K个人所在的节点
while(true)//只剩一个数据时退出
{
count=1;
//del=temp;
while(count<m)
{
temp=temp->next;
if(temp!=p)
{
count++;
}
}//找到数到m的节点
t=temp->next;//指向被删除掉的节点的下一个节点
delNode(p, temp->id);
temp=t;
if(tempp)
temp=temp->next;//判断是否指向头结点,以避免出现多计算步数和找不到数据点的情况:比如3 1 2,
if((temp->nextp)&&(p->next==temp))
break;
}
printf(“报数结束!\n”);
display§;
return 0;
}