/*
* 下面是我帮你写的一个“约瑟夫环算法”的实现。经测试后是对的,好好享用吧!
* :-)
* 约瑟夫环是:编号为1,2, ... ,n的n个人按顺时针方向围坐一圈,每个人
* 持有一个密码。一开始任选一个正整数作为报数上限值m,从第一个人开
* 始按顺时针方向自1开始顺报数,报到m时停止报数。报到m时停止报数。
* 报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人
* 开始重新从1报数,如此下去,直至所有人全部出列为止。
*
* 分析:
* 可以先建一个单向循环链表;而整个“约瑟夫环”问题的过程,最终是
* 把这个链表删空为止。但在删时不能顺着删,而是按该问题的方案来删,
* 这也是这个问题的价值所在。细节部分可以看StatGame函数。
*--------------------------------------------------------------
* 实现环境:Dev-C++ 4.8.6.0, TC2.0
* 完成时间:2003年10月13日
*/
#include <stdio.h>
#include <stdlib.h>
#define MAX_NODE_NUM 100
#define TRUE 1U
#define FALSE 0U
typedef struct NodeType
{
int id; /* 编号 */
int cipher; /* 密码 */
struct NodeType *next;
} NodeType;
/* 创建单向循环链表 */
static void CreaList(NodeType **, const int);
/* 运行 "约瑟夫环 "问题 */
static void StatGame(NodeType **, int);
/* 打印循环链表 */
static void PrntList(const NodeType *);
/* 得到一个结点 */
static NodeType *GetNode(const int, const int);
/* 测试链表是否为空, 空为TRUE,非空为FALSE */
static unsigned EmptyList(const NodeType *);
int main(void)
{
int n, m;
NodeType *pHead = NULL;
while (1)
{
printf( "请输入人数n(最多%d个):", MAX_NODE_NUM);
scanf( "%d", &n);
printf( "和初始密码m: ");
scanf( "%d", &m);
if (n>MAX_NODE_NUM)
{
printf( "人数太多,请重新输入!\n ");
continue;
}
else
break;
}
CreaList(&pHead, n);
printf( "\n------------ 循环链表原始打印 -------------\n ");
PrntList(pHead);
printf( "\n-------------- 出队情况打印 ---------------\n ");
StatGame(&pHead, m);
printf( "\n 约瑟夫环 问题完成!\n ");
return 0;
}
static void CreaList(NodeType **ppHead, const int n)
{
int i, iCipher;
NodeType *pNew, *pCur;
for(i=1;i<=n;i++)
{
printf( "输入第%d个人的密码: ", i);
scanf( "%d", &iCipher);
pNew=GetNode(i,iCipher);
if (*ppHead==NULL)
{
*ppHead=pCur=pNew;
pCur-> next=*ppHead;
}
else
{
pNew-> next=pCur-> next;
pCur-> next=pNew;
pCur=pNew;
}
}
printf( "完成单向循环链表的创建!\n ");
}
static void StatGame(NodeType **ppHead, int iCipher)
{
int iCounter, iFlag=1;
NodeType *pPrv, *pCur, *pDel;
pPrv=pCur=*ppHead;
/* 将pPrv初始为指向尾结点,为删除作好准备 */
while (pPrv-> next!=*ppHead)
pPrv=pPrv-> next;
while (iFlag) /* 开始搞了! */
{
/* 这里是记数,无非是移动iCipher-1趟指针! */
for (iCounter=1;iCounter<iCipher;iCounter++)
{
pPrv=pCur;
pCur=pCur-> next;
}
if (pPrv==pCur) /* 是否为最后一个结点了 */
iFlag=0;
pDel=pCur; /* 删除pCur指向的结点,即有人出列 */
pPrv-> next=pCur-> next;
pCur=pCur-> next;
iCipher=pDel-> cipher;
printf( "第%d个人出列, 密码: %d\n ",
pDel-> id, /* 这个编号标识出列的顺序 */
pDel-> cipher);
free(pDel);
}
*ppHead=NULL; /* 没人了!为了安全就给个空值 */
}
static void PrntList(const NodeType *pHead)
{
const NodeType *pCur=pHead;
if (EmptyList(pHead))
return;
do
{
printf( "第%d个人, 密码: %d\n ", pCur-> id,
pCur-> cipher);
pCur=pCur->next;
} while (pCur!=pHead);
}
static NodeType *GetNode(const int iId, const int iCipher)
{
NodeType *pNew;
pNew=(NodeType *)malloc(sizeof(NodeType));
if (!pNew)
{
printf( "Error, the memory is not enough!\n ");
exit(-1);
}
pNew-> id=iId;
pNew-> cipher=iCipher;
pNew-> next=NULL;
return pNew;
}
static unsigned EmptyList(const NodeType *pHead)
{
if (!pHead)
{
printf( "The list is empty!\n ");
return TRUE;
}
return FALSE;
}
/*********************************************** */
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
数据结构实验集 各种存储结构的基本函数源代码 (276个子文件)
约瑟夫.c 5KB
顺序串的基本操作.c 4KB
li.c 4KB
广义表.c 3KB
SY_1.c 3KB
霍夫曼编码.c 3KB
SY2.c 3KB
SY2循环队列的基本操作.c 2KB
2.c 2KB
1.c 1KB
稀疏矩阵存储及转置.c 1KB
sy2.c 849B
2.c 0B
wyw.cpp 13KB
lijun.cpp 5KB
1.cpp 5KB
llijun.cpp 3KB
li.cpp 2KB
1.cpp 2KB
1.cpp 1KB
实验2 链队列的基本操作.doc 332KB
学号E30914091 李俊.doc 202KB
实验3树与二叉树.doc 121KB
SY4.doc 61KB
SY2循环队列的基本操作.dsp 3KB
稀疏矩阵存储及转置.dsp 3KB
顺序串的基本操作.dsp 3KB
霍夫曼编码.dsp 3KB
约瑟夫.dsp 3KB
llijun.dsp 3KB
广义表.dsp 3KB
lijun.dsp 3KB
SY_1.dsp 3KB
wyw.dsp 3KB
sy2.dsp 3KB
SY2.dsp 3KB
li.dsp 3KB
li.dsp 3KB
1.dsp 3KB
1.dsp 3KB
1.dsp 3KB
2.dsp 3KB
1.dsp 3KB
2.dsp 3KB
SY2循环队列的基本操作.dsw 550B
稀疏矩阵存储及转置.dsw 544B
顺序串的基本操作.dsw 540B
霍夫曼编码.dsw 528B
约瑟夫.dsw 520B
llijun.dsw 520B
广义表.dsw 520B
lijun.dsw 518B
SY_1.dsw 516B
sy2.dsw 514B
wyw.dsw 514B
SY2.dsw 514B
li.dsw 512B
li.dsw 512B
1.dsw 510B
2.dsw 510B
1.dsw 510B
1.dsw 510B
1.dsw 510B
2.dsw 510B
测试5.exe 540KB
wyw.exe 220KB
1.exe 204KB
SY2.exe 188KB
SY_1.exe 188KB
顺序串的基本操作.exe 184KB
sy2.exe 184KB
li.exe 184KB
li.exe 184KB
1.exe 184KB
SY2循环队列的基本操作.exe 180KB
llijun.exe 180KB
lijun.exe 180KB
2.exe 180KB
稀疏矩阵存储及转置.exe 180KB
li.exe 180KB
1.exe 180KB
1.exe 180KB
霍夫曼编码.exe 180KB
约瑟夫.exe 180KB
广义表.exe 180KB
2.exe 180KB
测试.exe 172KB
vc60.idb 89KB
vc60.idb 41KB
vc60.idb 41KB
vc60.idb 33KB
vc60.idb 33KB
vc60.idb 33KB
vc60.idb 33KB
vc60.idb 33KB
vc60.idb 33KB
vc60.idb 33KB
vc60.idb 33KB
vc60.idb 33KB
vc60.idb 33KB
共 276 条
- 1
- 2
- 3
资源评论
lj19900815
- 粉丝: 1
- 资源: 4
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功