循环链表实现约瑟夫环

 设计一个带头结点的循环单链表类,实现约瑟夫环问题;
问题描述:设编号为1,2,…,n(n>0)个人按顺时针方向围坐-圈,每人持有一个正整数密码。
开始时任意给出一个报数上限值m从第一个人开始顺时针方向自1起顺序报数。
报到m时停止报数,报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人起重新自1起顺序报数.
如此下去,直到所有人全部出列为止。要求设计一个程序模拟此过程,并给出出列人的编号序列。
测试数据:n=7,7个人的密码依次为3,1,7,2,4,8,4   初始报数上限值m=20
正确的顺序:6,1,4,7,2,3,5
#include <stdio.h>
#include <malloc.h>

struct llist
{
	int number;//编号
	int psw;//密码
	struct llist *next;
};

typedef struct llist node;
typedef node *llink;

// llink CreateList(int total)
// {
// 	llink newNode;
// 	llink before,firstNode;
// 	int i;
// 	
// 	firstNode = (llink)malloc(sizeof(node));
// 	if(!firstNode)
// 		return firstNode;
// 	firstNode->number = 1;
// 	printf("请输入第1个人的密码:");
// 	scanf("%d",&firstNode->psw);
// 	firstNode->next = NULL;
// 	before = firstNode;
// 	
// 	for (i=2;i<=total;i++)
// 	{
// 		newNode = (llink)malloc(sizeof(node));
// 		if(!newNode)
// 			return NULL;
// 		newNode->number = i;
// 		printf("请输入第%d个人的密码:",i);
// 		scanf("%d",&newNode->psw);
// 		newNode->next = NULL;
// 		before->next = newNode;
// 		newNode = before;
// 	}
// 	newNode->next = firstNode;
// 	return firstNode;
// }

llink CreateList(int total)
{
	llink newNode;
	llink before,firstNode;
	int i;
	
	firstNode = before = (llink)malloc(sizeof(node));
	if(!before)
		return before;
	before->number = 1;
	printf("请输入第1个人的密码:");
	scanf("%d",&before->psw);
	
	for (i=2;i<=total;i++)
	{
		newNode = (llink)malloc(sizeof(node));
		if(!newNode)
			return NULL;
		newNode->number = i;
		printf("请输入第%d个人的密码:",i);
		scanf("%d",&newNode->psw);
		before->next = newNode;
		before = newNode;
	}
	before->next = firstNode;
	return firstNode;
}
void JosePush(llink L)
{
	int i,m;
	llink p,q,s;
	p = L;
	printf("请输入初始密码:");
	scanf("%d",&m);
	printf("出列顺序为:");
	while(p->next != p)
	{	
		for (i=1;i<m;i++)
		{
			q = p;
			p = p->next;
		}
		printf("%5d",p->number);

		m = p->psw;		
		s = p;
		q->next = p->next;
		p = p->next;
		free(s);
	}
	printf("%5d",p->number);
	printf("\n");
}

void main()
{
	llink L;
	int n;
	printf("实验人数:");
	scanf("%d",&n);
	L = CreateList(n);
	JosePush(L);
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章