约瑟夫问题及习题实验-2014.ppt

  1. 1、本文档共13页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

无头链表及应用无头链表及应用2.5.2约瑟夫问题“约瑟夫问题”是指n个人围坐在一张圆桌周围,从某人开始由1报数,数到m的人就出列(离开座位,不再参加以后的报数),然后从下一个人开始重新从1报数,数到m的人又出列。如此下去,直到所有的人都出列。试求他们出局的次序。2.5.2约瑟夫问题例如,当n=8、m=4时,若从第1个人开始报数,那么得到的出列次序是:4,8,5,2,1,3,7,6如图所示(方框内数字为人的编号,圆圈内数字为出列顺序)12345687①②③④⑤⑥⑦⑧人员编号出列顺序可用不带头结点的循环链表来解决该问题:它共有n个存储结点,每个结点由data(里面是人的编号)和next(指向下一个结点的指针)组成。假定第1次从编号为s的人那里开始数数m。算法取名为Josephus(),参数为n、m、s。HZHAOQIANSUNLIZHOUWUZHENGWANG用不带头结点的循环链表求解约瑟夫问题的算法算法2-18Josephus(n,m,s){ Ck_t=NULL; for(i=n;i=1;i--){ ptr=malloc(size); ptr-data=i; if(Ck_t==NULL) { ptr-next=ptr; Ck_t=ptr;} else {ptr-next=Ck_t-next; Ck_t-next=ptr;}}算法描述//是从后往前形成有n个结点的Josephus循环链表,//如果插入的为第一个元素p=Ck_t;q=Ck_t-next;for(i=1;is;i++){p=q;q=q-next;}for(i=1;in;i++){for(j=1;jm;j++){p=q;q=q-next;}printf(“%d”,q-data);p-next=q-next;free(q);q=p-next;}printf(“%d”,q-data);free(q);}//用来从表头开始顺序查找第s个结点C语言实现约瑟夫问题#includestdio.h//文件包函#includestdlib.htypedefstructnode{ intdata; structnode*next;}node,*linklist;//数据类型生成#defineN10//定义符号常量#defineM4#defineS6datanext结点voidmain(){ node*h=NULL,*q,*p; inti,j; for(i=N;i=1;i--) {p=(linklist)malloc(sizeof(node)); p-data=i; if(h==NULL) { p-next=p; h=p; } else { p-next=h-next; h-next=p; } }datanext∧hqp10xtdatanext9xt没有头结点的链表,插入操作不一致。voidmain(){ node*h=NULL,*q,*p; inti,j; for(i=N;i=1;i--) {p=(linklist)malloc(sizeof(node)); p-data=i; if(h==NULL) { p-next=p; h=p; } else { p-next=h-next; h-next=p; } }datanext∧hqp10xtdatanext9xt相当于头插法datanext8xtdatanext∧hqp10xt9nextxt8nextxtdatanext…xtdatanext3xtdatanext2xtdatanext1xtq=h-next; for(i=1;iS;i++) { p=q; q=q-next; } q从第s=3个开始,报数为m=4,pdatanext∧h10xt9nextxt8nextxt

文档评论(0)

优美的文学 + 关注
实名认证
内容提供者

优美的文学优美的文学优美的文学优美的文学优美的文学

1亿VIP精品文档

相关文档