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



#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值