约瑟夫环问题

用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至全部输出。写出C程序。

//采用循环单链表结构来实现
//节点结构
struct LNode{
	int num;
	LNode *next;
};

int main()
{
	int N,M;
	cin>>N;
	cin>>M;

	LNode *head, *p, *r;
	//创建第一个节点
	head = (LNode*) malloc(sizeof(LNode));
	head->num = 1;
	//创建其他节点
	p = head;
	for(int i=2; i<=N; ++i){
		p->next = (LNode*) malloc(sizeof(LNode));
		p = p->next;
		p->num = i;
	}
	//最后一个结点的指针域指向第一个结点,构成循环链表
	p->next = head;

	//输出循环链表的各个值
	while(N--){
		//计数到M
		for(int m=1; m<M; ++m)
		{
			p = p->next;			//p指向第M-1个节点
		}
		r = p->next;				//r指向第M个节点
		p->next = p->next->next;//删除第M个节点
		cout<<(r->num)<<endl;	//打印第M个节点的值
		free(r);				
	}
	return 0;
}

结果:

N = 15
M = 4

4
8
12
1
6
11
2
9
15
10
5
3
7
14
13


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值