约瑟夫环问题(循环链表实现C)

约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依规律重复下去,直到圆桌周围的人全部出列。


以下是代码实现(c语言)

#include<stdio.h>
#include<stdlib.h>
typedef struct node{
	int date;
	struct node *next;
}node,*linklist;


linklist creat(int n)
{
	linklist p=NULL,head;

	head=(linklist)malloc(sizeof(node));//建立头结点 

	p=head;//p为指向当前节点的指针
	
	linklist s;
	
	int i=1;

	if(n!=0)
	{
		while(i<=n)
		{
			s=(linklist)malloc(sizeof(node));
			s->date=i++;
			p->next=s;
			p=s;
		}
		s->next=head->next;//首尾相连,头结点可以直接删掉,指向的是head->next,而不是head因为头结点里没有数据 
		
	 } 
	 free(head);
	 return s->next;
 } 
 int main()
 {
 	int n=41;
 	int m=3;
 	int i;
 	linklist p=creat(n);
 	linklist temp;
 	
	 m%=n;
 	while(p!=p->next)
 	{
 		for(i=1;i<m-1;i++)
 		{
 			p=p->next;
		 }
		 printf("%d->",p->next->date);
		 temp=p->next;
		 p->next=temp->next;//连接2,4结点,  一般要删除一个结点的时候一定要注意最后要接上去
		 free(temp);
		 p=p->next;
	 }
	 printf("%d\n",p->date);
	 return 0;
	 system("pause");
 }

    原文作者:约瑟夫环问题
    原文地址: https://blog.csdn.net/I_amSHm/article/details/53264712
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞