- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
约瑟夫环问题及程序
问题描述:
编号是1,2,……n的n个人按照顺时针方向围坐一圈。现在从第s个人开始顺序报数,数到第m的人出列,然后从出列的下一个人重新开始报数,数到第m的人又出列,……如此反复,直到所有的人都出列为止。
解决思路:
首先利用线性表的一些运算如创建空线性表、插入元素等构造Josephus表。
从Josephus表中的第s个结点开始寻找、输出和删除表中的第m个结点,然后再从该结点的下一个结点开始寻找、输出和删除表中的第m个结点,重复此过程,直到表中的所有元素都删除。
算法基本思想:
用整数i来代替ni,将初始序列改写成一个整数的序列:1,2,3,……,n,并把它们存储在一个palist所指向的顺序表中,当s=n时,第s个人放在palist-elem[s-1]之中,因此第一个报数出列的应该是下标为s-1+m-1对n取模后的元素,如果这个下标为i,出列工作只要将palist-elem[i]从顺序表中删除,然后对palist-elem[0],palist-elem[1],……,palist-elem[n-2]从下标i开始重复上述过程。
程序清单:
#includestdio.h
#includestdlib.h
#define FALSE 0
#define TRUE 1
typedef int DataType;
struct SeqList
{
int MAXNUM;
int n;
DataType *elem;
};
typedef struct SeqList *PSeqList;
PSeqList createNullList_seq(int m)
{
PSeqList palist=(PSeqList)malloc(sizeof(struct SeqList));
if(palist!=NULL)
{
palist-elem=(DataType *)malloc(sizeof(DataType)*m);
if(palist-elem)
{
palist-MAXNUM=m;
palist-n=0;
return palist;
}
else
free(palist);
}
printf(Out of space!!\n);
return NULL;
}
int isNullList_seq(PSeqList palist)
{
return(palist-n==0);
}
int locate_seq(PSeqList palist,DataType x)
{
int q;
for(q=0;qpalist-n;q++)
if(palist-elem[q]==x)
return(q);
return -1;
}
int insertPre_seq(PSeqList palist,int p,DataType x)
{
int q;
if(palist-n=palist-MAXNUM)
{
printf(Overflow!\n);
return 0;
}
if(isNullList_seq(palist))
{
palist-elem[0]=x;
palist-n=1;
return 1;
}
if(p0||ppalist-n)
{
printf(Not exist!\n);
return 0;
}
for(q=palist-n-1;q=p;q--)
palist-elem[q+1]=palist-elem[q];
palist-elem[p]=x;
palist-n=palist-n+1;
return 1;
}
int deleteP_seq(PSeqList palist,int p)
{
int q;
if(p0||ppalist-n-1)
{
printf(Not exist!\n);
return 0;
}
for(q=p;qpalist-n-1;q++)
palist-elem[q]=palist-elem[q+1];
palist-n=palist-n-1;
return 1;
}
void josephus_seq(PSeqList palist,int s,int m)
{
int s1,i,w;
s1=s-1;
for(i=palist-n;i0;i--)
{
s1=(s1+m-1)%i;
w=palist-elem[s1];
printf(Out element %d\n,w);
deleteP_seq(palist,s1);
}
}
main()
{
PSeqList jos_al
文档评论(0)