数据结构与算法之———约瑟夫环



#include “stdio.h”
#include”stdlib.h”
#define   max  100
typedef struct NodeType
{
 int id;
 int password;
 struct NodeType *next;
}NodeType;
NodeType *getnode(int iId,int ipassword)
{
 NodeType *pnew=NULL;
 pnew=(NodeType *)malloc(sizeof(NodeType));
 if(!pnew)
 {
  printf(“ERROR”);
  exit (-1);
 }
 pnew->id=iId;
 pnew->password=ipassword;
 pnew->next=NULL;
 return pnew;
}

void crealist (NodeType **pphead,int n)//建立循环列表。
{
 int i=0;
 int ipassword=0;
 NodeType *pnew=NULL;
 NodeType *pcur=NULL;
 for(i=1;i<=n;i++)
 {
  scanf(“%d”,&ipassword); // 输入第个人的密码
  pnew=getnode(i,ipassword);//调用函数
  if(*pphead==NULL)
  {
   *pphead=pcur=pnew;
   pcur->next=*pphead;
  }
  else
  {
   pnew->next=pcur->next;
   pcur->next=pnew;
   pcur=pnew;
  }
 }// 完成单向链表的创建
}
void JosephsOperate(NodeType **pphead,int m)
{
 int icounter=0;
 int iflag=1;
 NodeType *p1=NULL;
 NodeType *p2=NULL;
 NodeType *p3=NULL;
 p1=p2=*pphead;
 while (p1->next!=*pphead)
  p1=p1->next;
 while(iflag)
 {
  for(icounter=1;icounter<m;icounter++)
  {
   p1=p2;
   p2=p2->next;
  }
  if(p1==p2)
   iflag=0;
  p3=p2;
  p1->next=p2->next;
  p2=p2->next;
  m=p3->password;
  printf(“%d “,p3->id);
  free(p3);
 }
  *pphead=NULL;
}
int main (void)
{
 int n=0;
 int m=0;
 NodeType *phead=NULL;
 scanf(“%d”,&n);//输入的人数。
 scanf(“%d”,&m);//初始密码
 crealist (&phead,n);
 JosephsOperate(&phead,m);
 return 1;
}

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