///循环链表的实际应用:解决约瑟夫环问题
#include<stdio.h>
#include<stdlib.h>
typedef struct PE
{
int number;
struct PE* next;
}PE;
PE* head = NULL;
void inilink(int n)
{
head = (PE*)malloc(sizeof(PE));
head->number = 1;
head->next = NULL;
PE* p = head;
for (int i = 2; i <= n; i++)
{
PE* body = (PE*)malloc(sizeof(PE));
body->number = i;
body->next = NULL;
p->next = body;
p = p->next;
}
p->next = head;//首尾相接,循环链表创建完毕;
}
void find(int k, int m)
{
PE* tail = head;//找到循环链表的"尾指针"
while (tail->next != head)
{
tail = tail->next;
}
PE* p = head;//调整循环链表的真正头尾
while (p->number != k)
{
tail = p;
p = p->next;
}
//开始进行模拟
int h = 1;
while (p->next != p)//p->next=p就是只剩一个人的情况
{
for (int i = 1; i < m; i++)//找到报m的人,并把报m-1的人的位置记录为尾位置
{
tail = p;
p = p->next;
}
tail->next = p->next;//删除报m的人
printf("第 %d 次成功淘汰了编号为 %d 的人\n", h, p->number);
h++;
free(p);
p = tail->next;
}
printf("最终只剩下编号为 %d 的选手,他是约瑟夫环的解!!!",p->number);
free(p);
}
int main()
{
int n,m,k;
printf("请输入约瑟夫环问题的总人数:");
scanf("%d", &n);
inilink(n);
printf("\n请输入约瑟夫环问题中开始报数的序号(1--%d):", n);
scanf("%d", &k);
printf("\n请输入与约瑟夫环问题中每次被淘汰的报数号:");
scanf("%d", &m);
printf("\n模拟开始运行......\n");
find(k, m);
return 0;
}
C数据结构与算法-基础整理-线性表-03:循环链表解决约瑟夫环
猜你喜欢
转载自blog.csdn.net/ATFWUS/article/details/104474786
今日推荐
周排行