C数据结构与算法-基础整理-线性表-03:循环链表解决约瑟夫环

///循环链表的实际应用:解决约瑟夫环问题

#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;
}
发布了50 篇原创文章 · 获赞 35 · 访问量 1290

猜你喜欢

转载自blog.csdn.net/ATFWUS/article/details/104474786