您的位置:首页 > 其它

循环链表实现约瑟夫环

2011-09-13 21:49 477 查看
设计一个带头结点的循环单链表类,实现约瑟夫环问题;

问题描述:设编号为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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: