约瑟夫环问题:有n个人围成一圈,依次报数,凡报到m的人便淘汰,下一个人便又开始报1,一直到还剩一个人为止,也就是胜利者
代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct ListNode
{
int data;
struct ListNode* next;
}ListNode;
ListNode* create_space() //开辟一个空间
{
return (ListNode *)malloc(sizeof(ListNode));
}
void creat(ListNode* head, int people_num)
{
ListNode *tmp, *pq;
head->data = 1; //初始化链表头
head->next = NULL;
tmp = head;
for (int i = 2; i <= people_num; i++)//确定玩的人数及给每个人编号
{
pq = create_space();
pq->data = i;
tmp->next = pq;
tmp = pq;
}
tmp->next = head;//将链表头尾相连
}
void game_zhixing(ListNode* head, int people_num, int num)
{
ListNode* tem, *tmp;
tem = head;
creat(head, people_num);
for (int i = 1; i < people_num; i++)//people_num个人玩,将执行people_num-1次循环
{
for (int j = 1; j < num - 1; j++)//逢num便淘汰,则指针将后移num-2位,指针指向当前人的下一位便淘汰
{
tem = tem->next;
}
tmp = tem->next;
printf("%d号淘汰\n", tmp->data);
tem->next = tmp->next;//将tmp指向的人淘汰掉
tem = tem->next;//tem当前指向报num-1的人,tem后移一位,则将继续报1.因为报num的人已被淘汰
}
printf("\n%d号胜利\n", tem->data);
}
int main()
{
int people_number, num;
ListNode* head = create_space();
printf("请输入人数:");
scanf("%d", &people_number);
printf("请输入淘汰数:");
scanf("%d", &num);
game_zhixing(head, people_number, num);
system("pause");
return 0;
}