一聚教程网:一个值得你收藏的教程网站

热门教程

约瑟夫环[循环链表的应用]

时间:2022-07-02 10:56:55 编辑:袖梨 来源:一聚教程网


 Josephy 问题概述: 假设有N个人坐在圆桌周围,从第S个人开始报数,报到M的出列,然后再从下一个人开始数报    数,数到M的人出列¨¨¨如此重复,知道所有的人都出列为止。要求出列的先后顺序输出每个人的信息 ! 
# include
# include
typedef int datatype;
typedef struct cnode
{
   datatype data;
   struct cnode *next;
}clistnode;
typedef clistnode *clinklist;
clinklist head;
void Joseph(int n,int m,int s)
{
  int i,j;
  clinklist creatclinklist(int);
  clistnode *p,*q,*r,*t;
  head=creatclinklist(n);
  q=head;
  if(s>n) printf("error!n");
  for(i=1;i        q=q->next;
         p=q->next;
  for(i=1;i<=n;i++)
  {
    j=1;
    while(j    {
      r=p;
      p=p->next;
      if(p==head)
        continue;
   j++;
    }
     printf("%4d",p->data);
     t=p;
     if(p->next==head)
     {
 p=p->next->next;
 r->next=head;
     }
     else
     {
      p=p->next;
      r->next=p;
     }
     free(t);
  }
 }
clinklist creatclinklist(int n)
{
  int i;
  clinklist p;
  p=(clinklist)malloc(sizeof(clistnode));
  p->next=NULL;
  head=p;
  printf("Please input the element records of the chain!n");
  for(i=n;i>0;i--)
  {   p=(clinklist)malloc(sizeof(clistnode));
      scanf("%d",&p->data);
     if(n==i)
     {
 p->next=head;
 head->next=p;
     }
     else
     {
       p->next=head->next