SDUT约瑟夫问题

SDUT约瑟夫问题_第1张图片
注:约瑟夫问题的代码实现需要链表能够循环,其次需要找准每次被杀对象,杀掉目标(将被杀对象的上一个与其下一个相连),输出最后存活的对象。
代码实现:


#include
using namespace std;
struct node
{
	int data;
	struct node *next,*front;
};
struct node *creat(int n)///建立双向链表。 
{
	struct node *head,*tail,*p;
	head=(struct node *)malloc(sizeof(struct node));
	head->next=NULL;
	head->front=NULL;
	head->data=1;
	tail=head;
	for(int i=2;i<=n;i++)
   {
	p=(struct node *)malloc(sizeof(struct node));
	p->next=NULL;
	p->front=NULL;
	p->data=i;
	tail->next=p;
	p->front=tail;
	tail=p;
   }
   tail->next=head;///让链表得以循环。 
   head->front=tail;
   return head;
 } 
 void game(struct node *head,int n,int x)///游戏开始。 
 {
 	struct node *p,*q;
 	p=head->front;
 	while(p->next!=p)
 	{
 		for(int i=1;i<x;i++)
 		{
 			p=p->next;
		 }
		 p->next=p->next->next;
	 }
printf("%d",p->data);
  } 
int main()
{	
int n,x;
scanf("%d%d",&n,&x);
struct node *head;
head=creat(n);
game(head,n,x);
return 0;
}

你可能感兴趣的:(链表,c#)