码迷,mamicode.com
首页 > 其他好文 > 详细

约瑟夫环问题

时间:2015-03-11 19:43:55      阅读:128      评论:0      收藏:0      [点我收藏+]

标签:

有N个人围一圈依次报数,数到3的倍数的人出列,问当只剩一个人时他原来的位子在哪里?

/*约瑟夫环问题---单向循环链表实现*/
/**********************************/
/**********Date:2015.3.11*********/
/*********author:xiaozhi xiong***/
/*******************************/
#include"stdio.h"
#include"stdlib.h"
struct node
{
	int data;
	struct node *next;
};
struct node *head;//链表的头节点
/************创建循环链表**************/
/**********input:链表头节点,人数******/
/************return:无*****************/
/************author:xiaozhi xiong******/
/**************************************/
void CreateLink(struct node *head,int len)
{
	struct node *newNode,*parNode;
	int i;
	head->data=1;
	parNode=head;
	for(i=2;i<=len;i++)
	{
		newNode=(struct node *)malloc(sizeof(struct node));
		newNode->data =i;
		newNode->next =NULL;
		parNode->next =newNode;
		parNode=newNode;
	}
	newNode->next=head;
}
/************输出循环链表**************/
/**********input:链表头节点************/
/************return:无*****************/
/************author:xiaozhi xiong******/
/**************************************/
void DisplayLink(struct node *head)
{
	struct node *p;
	if(head==NULL)
	{
		printf("链表为空\n");
		return;
	}
	p=head;
	printf("循环链表:\n");
	while(p->next!=head)
	{
		printf("%d  ",p->data );
		p=p->next ;
	}
	printf("%d  ",p->data );
}
/************约瑟夫环******************/
/**********input:链表头节点************/
/**********input:链表长度**************/
/**********input:第几个开始计数********/
/************return:无*****************/
/************author:xiaozhi xiong******/
/**************************************/
void Jose(struct node *head,int len,int num)
{
	int i;
	struct node *startNode,*endNode,*midNode;
	startNode=head;
	if(num>len)
	{
		printf("输入有误,不能从第%d个开始",num);
		return;
	}
	if(num>1)
	{
		for(i=2;i<=num;i++)
			startNode=startNode->next ;
	}
	
	midNode=startNode->next ;
	endNode=midNode->next;
	while(!(startNode==midNode&&midNode==endNode))
	{
		//删除第三个节点
		midNode->next =endNode->next ;
		//重新分配节点
		startNode=endNode->next ;
		midNode=startNode->next ;
     	endNode=midNode->next;
	}
	printf("最后一个节点为%d",startNode->data );
}
void main()
{
	head=(struct node *)malloc(sizeof(struct node));
	head->next =NULL;
	CreateLink(head,4);
	DisplayLink(head);
	Jose(head,4,1);
	getchar();

}


约瑟夫环问题

标签:

原文地址:http://blog.csdn.net/jxxiongxiaozhi/article/details/44202351

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!