Josephus问题求解

/*
 * Josephus问题:
 * 设有n个人围坐一个圆桌周围,现从第1个人开始报数,数到第m的人出列,
 * 然后从出列的下一个重新开始报数,数到第m的人又出列……如此重复,直
 * 到所有的人全部出列为止。
 * 对任意给定的n、m,求按出列次序得到的n个人员的顺序表。
 */
/* 链表 */
typedef struct LNode {
	int elem;
	struct LNode *next;
} *LinkList;

void create_link_list(struct LNode **listptr, int n)
{
	struct LNode *list = (struct LNode *) malloc(sizeof(struct LNode));
	list->elem = -1;
	list->next = NULL;
	struct LNode *elem = NULL;
	struct LNode *current = list;
	int i = 0;
	for (; i < n; i++) {
		elem = (struct LNode *) malloc(sizeof(struct LNode));
		elem->elem = i;
		elem->next = NULL;
		current->next = elem;
		current = current->next;
	}
	current->next = list;
	*listptr = list;
}

int Josephus(int n, int m)
{
	//创建循环链表
	struct LNode *list = NULL;
	create_link_list(&list, n);

	//查找第m个人(编号从0开始,第m个人即是编号为m-1的那个人)
	struct LNode *current = list->next;
	int i = 0;
	for (; list->next != list; i++) {
		if (i == m - 2) {
			//删除第m-1号元素
			if (current->next == list) {
				current = list;
			}
			struct LNode * temp = current->next;
			current->next = temp->next;
			current = current->next;
			fprintf(stdout, "deleted Node:{elem==%d/tnext==%u}/n", 
                       temp->elem, temp->next);
			free(temp);
			i = -1;
			continue;
		}

		if (current == list) {
			current = list->next;
			i--;
		} else if (current->next == list) {
			current = list->next;
		} else {
			current = current->next;
		}
	}	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值