约瑟夫环问题实验
源代码
#include<stdio.h>
#include<stdlib.h>
typedef int ElementType;
typedef struct QNode* Queue;
typedef struct QNode* PtrToQNode;
struct QNode {
ElementType Data;
PtrToQNode Next;
};
void JosephRing(int, int, int);//约瑟夫环函数
int Judge(int, int, int);//判断输入数据是否正常
int main(void)
{
int n;
int k;
int m;
do {
printf("已知");
scanf("%d", &n);
printf("围坐在一张圆桌周围\n");
printf("编号为");
scanf("%d", &k);
printf("开始报数\n");
printf("到");
scanf("%d", &m);
printf("出列\n");
} while (Judge(n, k, m));
JosephRing(n, k, m);
return 0;
}
Queue CreateRing(int);//创建一个约瑟夫环
int IsEmpty_Ring(Queue);//判断环中是否只剩下一个元素
void JosephRing(int n, int k, int m)
{
Queue Q;
PtrToQNode Pre;//指针指向当前报数的人的前驱
PtrToQNode PtQ;//指针指向当前报数的人
int i = 0;
Q = CreateRing(n);
PtQ = Q->Next;
Pre = PtQ;
for (i = 1; i < k; i++) {//从编号为k的人开始报数
PtQ = PtQ->Next;
}
while (!IsEmpty_Ring(PtQ)) {//判断PtQ指向的是否是环中最后一个元素
for (i = 1; i < m; i++)
{
Pre = PtQ;
PtQ = PtQ->Next;
}
printf("%d ", PtQ->Data);
Pre->Next = PtQ->Next;
free(PtQ);//数到m的那个人出列
PtQ = Pre->Next;//他的下一个人又从1开始报数
}
free(Q);//释放队首结点
}
Queue CreateRing(int n)
{
Queue Q;
PtrToQNode Pre;//插入结点的前驱
PtrToQNode PtQ;
int i;
Q = (Queue)malloc(sizeof(struct QNode));
Q->Next = NULL;
Pre = Q;
for (i = 1; i <= n; i++) {
PtQ = (Queue)malloc(sizeof(struct QNode));
PtQ->Data = i;//创建结点
PtQ->Next = NULL;
Pre->Next = PtQ;
Pre = PtQ; //尾插法插入结点
}
PtQ->Next = Q->Next;//尾部结点指向首结点
return Q;
}
int IsEmpty_Ring(Queue Q)
{
if (Q->Next == Q->Next->Next)
{
printf("%d ", Q->Next->Data);
return 1;
}
else
return 0;
}
int Judge(int n, int k, int m)
{
if (n < k) {
printf("只有%d的人,没有编号%d", n, k);
return 1;
}
else
return 0;
}