约瑟夫环——C语言循环链表模拟

约瑟夫问题
已知n个人围城一周,编号1,2,3,.......,n,从1号
开始报数,每隔k个人报到数的人出列。
常见解决方法,递归或循环链表模拟
循环链表模拟代码
#include<stdio.h>    //以30个人为例 ,每7个人出列为例
#include<malloc.h>
#define elemtype int
#define status int 
#define ok 1
#define fail 0

typedef struct list{           //定义链表结构	
	elemtype data;	
	list *next;
	
}linklist , *linklistpoint ;

int initlinklist(linklistpoint l)  //初始化循环链表
{
	  int i = 1;
	  linklistpoint m,n;
	  m = l;
	  n = l;
	  for(i = 1;i<=30;i++)    //总共30个节点
	  {
	  	  m->data = i;
	  	  if(i != 30){
	  	  n = (linklist*)malloc(sizeof(linklist));
	  	  m->next = n;
	  	  m = n;
	  }
	     else
	      m->data = i;      //将每个节点相应编号
	      m->next = l;	  	  
	  }	  
      return m->data ;           //返回总个数
}

status joseph(linklistpoint l,int i)    //模拟函数
{
	 int answer;    //存放最终结果
	 linklistpoint m;
	 linklistpoint x;
	 int n;
	 m = l;
	 x = l;
	 n = 1;          //当只剩最后一个节点时,模拟结束  
	 while(m->next != m ){
	 	   for(n = 1;n < i-1;n++)  //每7人出列一个
	 	   {
	 	   	   m = m->next;
			}
			printf("%d->",m->next->data);  //打印删去的节点
		  x = m->next;
		  m->next = x->next;	 	  
                  m = m->next;	
	 }	 	
	 answer = m->data;	 
	 return answer;
}

int main(){
	
	linklist l;
	linklistpoint p;
	int answer;
	int i;
	p = &l;
        answer = initlinklist(p);
	i = 7;
        printf("%d\n",answer);	
        answer = joseph(p,i);
	printf("%d",answer);	
	return 0;
}

模拟实例 编译器DEVC++

猜你喜欢

转载自blog.csdn.net/jazrynwong/article/details/80552567