约瑟夫问题升级版

     编号为1~N的N个人按顺时针方向围坐一圈,每人持有一个密码(正整数,可以自由输入),开始人选一个正整数作为报数上限值M,从第一个人按顺时针方向自1开始顺序报数,报道M时停止报数。报M的人出列,将他的密码作为新的M值,从他顺时针方向上的下一个人开始从1报数,如此下去,直至所有人全部出列为止。

     

#include
#include
	struct node
	{
		 int data;     //elementype表示一种数据类型,可能是int/char等等
		 struct node *next;   //next 指针,用于链表结构指向下一个节点
	};
	typedef struct node node; //重定义struct node类型为node

	node* Creat(int n);
	int main()
	{
		int n = 41;
		int m ;
		int i;
		node *p = Creat(n);
		node *temp;
		scanf("%d",&m);
		m %= n;
		while(p != p->next)
		{
			for(i = 1;i < m-1; i++)
			{
				p = p->next;
			}
			printf("%d->",p->next->data);

			temp = p->next;
			p->next = temp->next;
			free(temp);

			p = p->next;

		scanf("%d",&m);
		m %= n;
		}
		printf("%d\n",p->data);

		return 0;
	}
	node* Creat(int n)
	{
		node *p = NULL;
		node *head;
		head =(node *)malloc(sizeof(node));
		p = head;
		node *s;
		int i = 1;
		if(0 != n)
		{
			while(i <= n)
			{
				s = (node*)malloc(sizeof(node));
				s->data = i;
				p->next = s;
				p = s;
				i++;
			}
			s->next = head->next;
		}
		free(head);
		return s->next;
	}


运行结果:

约瑟夫问题升级版_第1张图片

你可能感兴趣的:(数据结构)