循環鏈表實現約瑟夫環

 設計一個帶頭結點的循環單鏈表類,實現約瑟夫環問題;
問題描述:設編號爲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);
}

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