//循环链表.h
#include "stdafx.h"
#include<iostream>
using namespace std;
typedef int Elemtype[2] ;
typedef struct l {
Elemtype elem;
struct l* next;
}l;//链表的结点类型为结构体;
l* r,*f;
bool initlist(l*&a)
{ a=(l*)malloc(sizeof(l));
if(!a)return false;
(*a).next=a;r=a;f=a;
return true;
}//键头结点;
void link(l* s)
{
(*r).next=s;
r=s;
(*s).next=f;
}//将结点连成循环链表;
void creat(int b)
{ int i=0;
for(i=0;i<b;i++)
{ l* s=new l;
link(s);
}
}//创建每个结点并连成链表;
void del(l*a)
{ l*p;
p=a->next->next;
free(a->next);
a->next=p;
}//将没用的结点删除;
#include "stdafx.h"
#include<iostream>
#include"循环链表.h"
using namespace std;
void fun(int& c)
{
int m;;l* a,*q;l*t=new l;
initlist(a);//建头结点;
creat(c);//链表建成;
t=a->next;//t指针指向第一个结点;
int i=0;
for(i=0;i<c;i++)
{ cout<<"请输入第"<<i+1<<"密码:"<<endl;
cin>>t->elem[0];
t->elem[1]=i+1;
t=t->next;
}//输入密码和号数;
cout<<"输入约瑟夫环的初始密码M:"<<endl;
cin>>m;//约瑟夫环的初始密码;
q=a ;//q指针指向头结点;
cout<<"约瑟夫环的结果:"<<endl;
while(c){
int j=m%c;//找到出列在链表中的位置;
if(j==0)j=c;
for(int i=0;i<j-1;i++)
if(q->next!=a ){q=q->next;}
else {q=q->next->next;}
//找到出列的前一个地址;
if(q->next==a){q=q->next;}//判断下一个是否为头结点;
t=q; //t为出列前一个的地址;
cout<<t->next->elem[1]<<",";//输出他在原先的号数;
m=t->next->elem[0];//把密码改成出列的密码;
del(t);c--;//在链表中删除出列的结点,并将链表长度减一;
}
//整个约瑟夫环的算法;
cout<<endl;
int y;
cin>>y;//让显示等待输入,以便用户查看结果;
}