#include <stdio.h>
#include <stdlib.h>
struct Node{//单链表存储结构
int data;//存放值
int num;//人的号码
struct Node *next;
};
int main()
{
struct Node *n1=(struct Node*)malloc(sizeof(struct Node));
struct Node *n2=(struct Node*)malloc(sizeof(struct Node));
struct Node *n3=(struct Node*)malloc(sizeof(struct Node));
struct Node *n4=(struct Node*)malloc(sizeof(struct Node));
struct Node *n5=(struct Node*)malloc(sizeof(struct Node));
struct Node *n6=(struct Node*)malloc(sizeof(struct Node));
struct Node *n7=(struct Node*)malloc(sizeof(struct Node));
n1->data=3;
n2->data=1;
n3->data=7;
n4->data=2;
n5->data=4;
n6->data=8;
n7->data=4;
n1->num=1;
n2->num=2;
n3->num=3;
n4->num=4;
n5->num=5;
n6->num=6;
n7->num=7;
n1->next=NULL;
n2->next=NULL;
n3->next=NULL;
n4->next=NULL;
n5->next=NULL;
n6->next=NULL;
n7->next=NULL;
//将节点连接成循环链表
n1->next=n2;
n2->next=n3;
n3->next=n4;
n4->next=n5;
n5->next=n6;
n6->next=n7;
n7->next=n1;
struct Node *p=(struct Node*)malloc(sizeof(struct Node));//p指向n1
p=n1;
int m=20,count=7;
while(count)
{
for(int i=0;i<m-2;i++)//减二是因为:p初始指向的是n1,末尾是目标的前一个人
{
p=p->next;
}//此时指针指向目标的前一个人,但是m是1无法指向前一个人
if(m==1)
{
printf("%d\n",p->num);//输出人
m=p->data; //获取值
//删除自己 要把指针指向自己的前面
struct Node *NodeFront=(struct Node*)malloc(sizeof(struct Node));
NodeFront=p;
while(NodeFront->next->data!=p->data)
{
NodeFront=NodeFront->next;
}
p=NodeFront;//NodeFront是以前P前面的人
p->next=p->next->next; //将自己删除
} else{
printf("%d\n",p->next->num);//输出人
m=p->next->data; //获取值
p->next=p->next->next; //删除
p=p->next;//目标被删除后,报数的是被删除的下一个
}
--count;
}
return 0;
}