约瑟夫环问题

/**
*约瑟夫环:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。
*从编号为k的人开始报数,数到m的那个人出列;
*他的下一个人又从1开始报数,数到m的那个人又出列;
*依此规律重复下去,直到圆桌周围的人全部出列。
*实现方式:循环链表
*2013-10-15
**/
#include<iostream>
#include<stdlib.h>

using namespace std;

typedef struct LNode{
	int data;
	struct LNode *next;
}LNode,*LinkList;

void JOSEPHUS(int n,int k,int m)//n为总人数,k为第一个开始报数的人,m为出列者喊到的数
{
	/*p为当前节点,r为辅助节点,指向p的前驱节点,l为头节点*/
	LinkList p,r,L;
	p = r = L = NULL;
	//建立循环链表
	
	int i;
    for ( i = 0; i < n; i++ )  
    {  
		p = (LinkList)malloc(sizeof(LNode));  
		p->data = i + 1;  
		if ( L == NULL )  
		{  
			L = p;  
			r = p;  
		}  
		else  
		{  
			r->next = p;  
			r = p;  
		}  
    } 
	//把链表连起来
	p->next = L;
	//输出链表
	p = L;
	cout << "输入链表" <<endl;
	for(i=0 ; i<n ; i++)
	{
		cout << p->data <<" ";
		p = p->next;
	}
	cout << endl;
	//将p重新指向头
	p = L;
	//把当前指针移动到第一个报数的人
	for(i=1 ; i<k ; i++)
	{
		r = p;
		p = p->next;
	}
	cout << "输出链表"<<endl;  
	
    //循环的删除队列结点  
    while ( p->next != p )  
    {  
		for ( i = 0; i < m - 1; i++ )  
		{  
			r = p;  
			p = p->next;  
		}  
		//指向的是第一个人,则将r指向最后一个元素  
		if ( p == L )  
		{  
			L = p->next;  
			r = p;  
			while( r->next != p )  
				r = r->next;  
		}      
		r->next = p->next;  
		cout << p->data <<" ";  
		free(p);  
		p = r->next;  
    }  
    cout << p->data <<endl;
}
int main()
{
	JOSEPHUS(13,9,2);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值