数据结构与算法——joseph环.docxVIP

  1. 1、本文档共9页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
数据结构与算法课程设计 joseph 环 152208100066 张小莲 目录 需求分析 03 需求分析 03 0404 04 04 算法分析 删除出列的结点 04判断是否所冇人全部出列04算法设计05PersonList 结构体 05CreateList 函数 05Exports 函数05完整代码 删除出列的结点 04 判断是否所冇人全部出列 04 算法设计 05 PersonList 结构体 05 CreateList 函数 05 Exports 函数 05 完整代码 07 结果说明 09 总结 10 需求分析 编号是1, 2n的n个人按照顺时针方向I韦I坐一圈,每个人只有一个密码(正整数)。 一开始任选一个正整数作为报数上限值m,从第一个人开始顺时针方向自1开始顺序报数, 报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向的下一 个人开始朿新从1报数,如此卜?去,直到所有人全部出列为止。设计一个程序来求出出列顺 序。 算法分析 1.该单循环链表的逻辑结构 由于题目要求“从第一个人开始顺时针方向自1开始顺序报数,报到m时停止报数。 报m的人出列,将他的密码作为新的m值,从他在顺时针方向的下一个人开始墜新从1报 数,如此卜?去”,队伍中编号最人的人报数完毕后编号最小的人应紧接着报数,所以创建链 表时链表中最后一个结点的next指针直接指向首结点而不是头结点比较合适。该单循环链 表的逻辑结构如下: 2.删除出列的结点 某结点出列后,应将该结点从单循环链表里删除,则需要找到该结点的前一个结点,并 由P指向它,通过修改指针域使结点p的直接后继为s的直接后继,即p-next=s-nexto当 mL时,即将出列的结点的前一个结点就是还未进行移动的为前的s指针指向的结点。当要 删除的结点恰好为head指向的结点时,删除前应修改head指向的结点为s-next? 3?判断是否所有人全部出列 由于结点出列后的删除操作,整个单循坏链表的表长是逐渐缩短的,直至单链表只剩下 头结点和首结点: 此时已经无法在进行删除结点操作,因为该结点的直接后继就是口但实际上,当只剩卜 一个人时无论m为何值此人直接出列就可以了。也就是说,当链表里只剩下最后一个结点 时己经不必进行删除操作,直接输出该结点的编号即可。 于是问题就转化成如何判断链表里只剩最后一个结点,判断head-next是否与head相 等可以解决问题。 算法设计 1. PersonList 结构体 每个结点包含编号,密码以及指向卜一个结点的指针域三个数据。 typedef struct node { int password; 〃密码 int number; 〃编号 struct node *next; 〃指针域 } PersonList; 2. CreateList 函数 该函数的功能是建立单循环链表,并从键盘读入每个编号的密码,入II参数n为单循坏 链表所包含的结点的个数,函数返回一个PersonList类型的指针。 PersonList *CreateList(int n) { PersonList *head/*s/*r; head=(PersonList *) malloc(sizeof(PersonList)); head-next=NULL; head-number=l; printf(“请输入编号为1的人的密码:”); scanf(“%d“,head-password); 〃从键盘中读取编号为1的人的密码 getchar(); 〃接收回车 r=head; for(int i=2;i=n;i++) { s=( Person List *) mal loc(sizeof (Person List)); s-next=NULL; s-number=i; printf(“请输入编号为%d的人的密码: sea nf (M sea nf (M%d s-pass word); getchar(); r-next=s; r=s; } r-next=head; return head; } 〃从键盘读入每个编号的密码 〃接收回车 〃插入新结点 〃将尾指针指向新结点 〃将最后一个结点的指针域指向首结点 3. Exports 函数 该说数的功能足模拟出列的过程,并按照出列的顺序输出毎个人的编号,入I I参数head 为单循环链表.入口参数m为初始报数上限值。 void Exports)PersonList *headjnt m) { PersonList *s/p; s=head; prlntf(M出列顺序为门; whilefhead =head-next) 〃当链表里有一个以上的结点时 〃若m=l可跳过for循坏 〃报数直到第m-1个结点 s=s-next; P=s; s=

文档评论(0)

laugh + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档