约瑟夫环数据结构实验报告.doc

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
一.问题描述 约瑟夫环问题的一种描述是:编号是1,2,……,n的n个人按照顺时针方向围坐一圈,每个人持有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个人开始顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向的下一个人开始重新从1报数,如此下去,直到所有人全部出列为止。设计一个程序来求出出列顺序。 二.基本要求 利用单向循环链表存储结构模拟此过程,按照出列的顺序输出各个人的编号。此题所用的循环链表中不需要“头结点”,请注意空表和非空表的界限。?? 三.需求分析   1:用一个循环链表实现n个人按顺时针排成一圈,每个人看作一个节点,每个节点都是一个结构体类型,包含三个域: 序号域(data), 密码域(key),指向下一个人的指针域(next).   2:程序开始时由用户任意输入人数n及一个正整数作为报数上限值m,一个正整数作为密码最大值,判断所输密码是否在范围内。然后为依次每一个人指定一个密码   3:初始密码为用户外部输入的密码m, 从第一个人开始按顺市针方向自1开始报数.,报道m的时停止,报m的人出列,将他的密码作为新的密码值(m), 从他在顺针方向的下一个人开始重新从1报数,如此下去,直至所有的人全部出列为止.   4:本程序最终结果为n 的人的出列顺序   5:测试数据: m的初值为1; n =5(即有5个人)57个人的密码依次为:1,2,3,4,5.首先没的值为1,正确的出列顺序应为1,2,4,3,5。   6:程序执行的过程为:  ???????(1)创建单向循环链表   ?? (2)开始报数   ?? (3)输出出列的顺序号 四.详细设计 ? ?1.本程序包含三个模块 ???? 1) 主程序模块 ?int main() ?{ ???? int m,n,i=0; ? LinkList s; ? printf(请输入报数上限m和人数n:\n);? ? do{ ?? if(i0) ??? printf(输入有误,请重新输入:\n); ? scanf(%d,m); ? ? getchar(); ? scanf(%d,n); ? getchar(); ? i++; ? }while(m = 0 || n = 0); ? s=CreatList_L(n); ? ListDelete_L(s,m,n); ? return 0; ?} ????? 2) 构造链表并输入每个人信息模块; LinkList L,r,q; ?int i,key; ?printf(请输入%d个数字作为每个人的密码:\n,n); ?for(i=1;i=n;i++) ?{ ? scanf(%d,key);? //输入每个人的密码 ? r=(LinkList)malloc(sizeof(LNode)); ? if(i==1) ? { ?? L=q=r; ? } ? else{ ???? q-next=r; ???? q=r; ? }???? ??????? r-num=i;? ??????? r-pwd=key; ?} ?r-next=L; //使最后节点指向首节点,形成循环链表 ?return L; //向主函数返回创建完成的循环链表首节点的地址 } 3)主要处理出列的函数: void ListDelete_L(LinkList L, int m, int n){ ?LinkList p,s; ?int j; ?while(n0){//只要人数大于0就继续,直到全部出列 ? p=L; ? for(j=1; jm; j++){? //顺序找到第m个节点(人)并使指针指向该节点 ?? s=p; ?? p=p-next; ? } ? printf(出列人原来的序号是:%d\n,p-num); //输出出列人序号 ? m=p-pwd; //将出列人的密码作为新的报数值m ? s-next=p-next;//将出列的节点(人)从循环链表中删除 ? L=p-next; ? free(p); ? n--; ?} } 2.设计程序如下: #includestdio.h #includemalloc.h typedef struct LNode{ ?int pwd,num; ?struct LNode *next; }LNode, *LinkList; LinkList CreatList_L(int n){ ?//建立循环链表 ?LinkList L,r,q; ?int i,key; ?printf(请输入%d个数字作为每个人的密码:\n,n); ?for(i=1;i=n;i++) ?{ ? scanf(%d,key);? //输入每个人的密码 ? r=(LinkList)malloc(

文档评论(0)

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

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

1亿VIP精品文档

相关文档