#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
// 函数结果状态代码
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
///////////////////////////////////////////////////////////////////////////
typedef int Status;
typedef int ElemType;
typedef struct NodeType
{
ElemType data,locate;
NodeType *next;
} NodeType,*LinkType; //结点类型,指针类型
typedef struct OrderedList{
LinkType head; //分别指向线性链表的头结点和尾结点
int size; //指示链表当前的长度
}OrderedList; //有序链表类型
///////////////////////////////////////////////////////////////////////////
bool InitList(OrderedList &L,int n)
{
if(n==0)
return ERROR;
int i;
LinkType q;
if(L.head=((NodeType*)malloc(sizeof(NodeType))))
{
printf("请输入第1个人的密码:");
scanf("%d",&L.head->data);
L.size=1;
L.head->locate=1;
L.head->next = L.head;
}
else
return ERROR;
q=L.head;
for(i=2;i<=n;i++)
{
if(q->next=((NodeType*)malloc(sizeof(NodeType))))
{
q=q->next;
printf("请输入第%d个人的密码:",i);
scanf("%d",&q->data);
L.size++;
q->locate=i;
}
else
return ERROR;
}
q->next=L.head;
return TRUE;
}
void Joseph(OrderedList &L,int m)
{
LinkType p = L.head;
LinkType q = p;
int i;
printf("输出顺序如下:");
while( L.size > 0 )
{
i = m - 1;
while( i > 0 )
{
q = p;
p = p->next;
i--;
}
printf("第%d个人,密码为:%d\n",p->locate,p->data);
q->next = p->next;
free(p);
L.size--;
p = q->next;
}
}
void main ()
{
int m;
int n;
OrderedList T;
//n表示约瑟夫环中节点个数,m表示报数循环的个数
printf("请输入n 与 m 的值\n");
scanf("%d %d",&n,&m);
if (n<1||m<1)
{
printf("对不起,输入有误!");
exit(OVERFLOW);
}
InitList(T,n);
Joseph(T,m);
getchar();
getchar();
}