《约瑟夫环 c语言版 课程设计.docx》由会员分享,可在线阅读,更多相关《约瑟夫环 c语言版 课程设计.docx(5页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、约瑟夫环 c语言版 课程设计 约瑟夫环 题目: 1、编号为1、 2、3n的n个人按顺时针方向围成一个圈,每人持有一个密码(正整 数)。一开始任选一个正整数作为报数的上限值m,从第一个人开始按顺时针方向自1开始报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。设计个出列顺序。 2、利用单向循环链表存储结构模拟约瑟夫过程。按照出列的顺序印出各人的编号 一、需求分析 1、本演示程序过程中,需要手动输入三个变量,总人数n,初值 m(第一个人出列时需要的数),每个人手中拥有的密码。 2、需要用到单向循环链表存储结
2、构模拟此过程,按照出列的顺序 印出各人的编号。 二、概要设计 为实现上述题目要求及需求,应该用单向循环链表存储结构模拟此过程。 抽象数据类型线性表的定义如下: ADT List 数据对象:D ai | ai ElemSet, i=1,2,.,n, n0 称 n 为线性表的表长; 称 n=0 时的线性表为 空表。 数据关系:R1 |ai-1 ,aiD, i=2,.,n 设线性表为 (a1,a2, . . . ,ai,. . ,an), 称 i 为 ai 在线性表中的位序。 三、详细设计 #include /头文件 #include /动态分配内存文件 typedef struct data /d
3、ata结构体 int num; int val; typdata; typedef struct node /node 链表结构体 typdata data; struct node*next; listnode; typedef listnode*linklist; linklist head; void main() int n,i,b,m,j; linklist head=(listnode*)malloc(sizeof(listnode); /动态分配内存 listnode *p,*q; printf(请输入总人数:); scanf(%d,&n); q=head; for(j=1;jn
4、ext=(listnode*)malloc(sizeof(listnode); /指针操作 q=q-next; q-data.val=b; q-data.num=j; q-next=head-next; printf(请输入初值: ); scanf(%d,&m); if(mnext; i+; p=q-next; q-next=p-next; printf( %d,p-data.num); free(p); q=q-next; while(q-next!=q); printf( %dn,q-data.num); free(q); free(head); 四、调试分析 1、在设计程序初期,由于对结
5、构体把握不好,造成程序中断,无 法继续,但是查阅多方资料,终于弄懂。 2、在结构体运用过程中,指针指向多次犯错,但经过改正,指针 没有问题了。 3、printf(“n”);写成printf(“%n”);造成程序无法输入, 粗心造成,下次避免。 4、在m的值需要-1的时候不理解程序运行过程,跟踪调试解决。 五、用户手册 本程序简洁明了,在界面就可以看出如何操作,步步均有提示,见下图 六、测试数据 m的初值为20,n=7,7个人的密码以此是:3,1,7,2,4,8,4,首先m的值为6(正确的出列顺序是:6,1,4,7,2,3,5). 测试结果见下图 七、附录 Stdio.h c语言头文件 Malloc.h 动态分配内存函数头文件