循环链表范例(约瑟夫问题)

从N个人中选出一个领导人,方法如下:

所有人排成一个圆圈,按顺序每隔第M个人淘汰出局,然后剩下的人聚拢重新形成圆圈,找出最后剩下的那个人


参考:《算法:C语言实现》 P52

#include <stdio.h>
#include <stdlib.h>
typedef int elem_type;
typedef struct Node node;
struct Node
{
	elem_type elem;
	node* next;
};

int main(int argc, char *argv[])
{
	int N = atoi(argv[1]);
	int M = atoi(argv[2]);
	node* h = (node*) malloc(sizeof(h)); //head
	node *x = h;
	h->elem = 1;
	h->next = h;
	for (int i = 2; i <= N; i++)
	{
		x->next =  (node*) malloc(sizeof(x)); 
		x = x->next;
		x->elem = i;
		x->next = h; //指向head,循环
	}
	 //x为最末一位
	while (x != x->next )
	{
		
		for (int i = 1; i < M; i++)
		{
			x = x->next;		//当i=1, x->elem=1;
									//当i=M-1, x->elem = M-1; 当 i = M, x为第M-1个
		}	
		printf("Delete: %d\n", x->next->elem);
		x->next = x->next->next;
		
	}
	printf("The leader's NO. is %d\n", x->elem);


	system("pause");
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值