网站大量收购独家精品文档,联系QQ:2885784924

约瑟夫环C实现.doc

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

author:Andy Suee Chan 一、需求分析 1、本程序演示约瑟夫问题:编号为1,2,...,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)开始任选一个正整数作为报数值,自第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数,报m的人出列,将他持有的密码作为新的m值,从他的顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有的人全部出列为止。编写完整的程序求出出列顺序。createNode(n,m) 操作结果:生成一个结点,n:编号、m:密码 createList(L,n) 操作结果:根据n的值,构造一个空的循环链表,n为链表中结点的个数 jose(L,n) 操作结果:实现出队操作 }ADT OrderedList 2、本程序包含三个模块 (1)构造结点模块 (2)生成链表模块 (3)出队处理 (4)主函数模块 各模块调用关系:(4)-》(2)-》(1),(4)-》(3) 三、详细设计 1、结点类型 typedef struct LNode { int num; //编号 int pwd; //密码 struct LNode *next; }LNode; 2、构造结点 LNode *createNode(int m_num,int m_pwd) { LNode *p; p = (LNode*)malloc(sizeof(LNode)); //生成一个结点 p-num = m_num; //把实参赋给结点相应的数据域 p-pwd = m_pwd; p-next = NULL; //指针域指向空 return p; } 3、生成链表 void createList(LNode **ppHead,int n) { int i,m_pwd; LNode *p, *cur; //cur :浮标指针 for(i = 1; i = n; i++) { printf( 输入第%d个人的密码:,i); scanf( %d,m_pwd); p = createNode(i,m_pwd); //调用构造结点函数 if(*ppHead == NULL) //如果头结点为空 { *ppHead = cur = p; //生成头结点,让cur指向它 cur- next = *ppHead; //cur的指针域指向自身 } else //如果不为空,则插入结点 { p- next = cur- next; cur- next = p; cur = p; //cur指向新插入结点 } } printf( 完成创建!\n ); //提示链表创建完成 } 4、出队处理 void jose(LNode **ppHead,int m_pwd) { int count,tag; //count:记数、tag:标记 tag= 1; //1:出队 0:结束 LNode *p, *cur, *p_del; p = cur = *ppHead; //指向头结点 while(p- next != *ppHead) //如果不是尾结点,就移动一次 { p = p- next; } while(tag) //标记为出队 { for(count = 1;count m_pwd;count++) //根据初始密码,移动m_pwd-1次 { p_del = cur; //把最后一个出队的结点赋给p_del指针 p- next = cur-next;

您可能关注的文档

文档评论(0)

asd522513656 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档