资源描述:
《数据结构课程设计二》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、数据结构课程设计二班级:06计本(1)姓名:魏建平学号:20060724035题目:严慰敏习题实习一的第二题,约瑟夫环问题:约瑟夫问题的一种描述是:编号为1,2,…,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个整数作为报数上限值m,从第一个人开始顺时针自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有的人全部出列为止。试设计一个程序,求出出列顺序。一、需求分析1、利用单向循环链表存储结构
2、模拟此过程,按照出列的顺序一次打印出每个人的编号。2、程序运行后,首先要求用户指定初始报数上限值,然后读取各人的密码。可设n≤30.此题所用的循环链表中不需要“头结点”,应注意空表和非空表的界限。3、程序执行的命令:提示用户选择相应操作以及输入相应的人数、每个人的密码和m值。4、测试数据:m的初值为20;n=7,7个人的密码依次是:3,1,7,2,4,8,4,出列的顺序为6,1,4,7,2,3,5。二、概要设计1、单向循环表的抽象数据类型定义typedefstructCLNode{ElemTypedat
3、a;ElemTypei;structCLNode*next;}CLNode,*CLinkList;2、Voidmain(){do{接受命令(提示用户选择功能);接受命令(提示用户输入参数);输入结果;}while(“命令”=”退出”)}3、本程序只有两个模块,调用简单:一、详细设计1、循环链表结构:typedefstructCLNode{ElemTypedata;ElemTypei;structCLNode*next;}CLNode,*CLinkLis2、初始化循环链表函数:voidinit_CLink
4、List(CLinkList*l){(*l)=(CLinkList)malloc(sizeof(structCLNode));(*l)->data=-1;(*l)->i=0;(*l)->next=(*l);}3、清空循环链表函数:voidclear_CLinkList(CLinkListl){CLNode*p,*useless;p=l->next;l->next=l;while(p!=l){useless=p;p=p->next;free(useless);}}4、创建约瑟夫环表函数:voidcrt_C
5、LinkList(CLinkListl){intnum,n;intj;CLNode*p,*r;clear_CLinkList(l);r=l;j=1;printf("输入游戏人数:");scanf("%d",&n);while(j<=n){printf("请输入第%d个人的密码:",j);scanf("%d",&num);p=(CLNode*)malloc(sizeof(structCLNode));p->data=num;p->i=j;r->next=p;r=p;j++;}r->next=l;}5、
6、显示表中元素函数:voiddisp_CLinkList(CLinkListl){introw=1;CLNode*p;p=l->next;printf("");while(p!=l){if(row==7){row=1;printf("");}printf("%5d:%-5d
7、",p->i,p->data);row++;p=p->next;}}6、销毁循环链表函数:voidrelease_CLinkList(CLinkListl)/{clear_CLinkList(l);free(l);}7、元素出
8、圈函数:voidgame(CLinkListl){intm,k=0;CLNode*p,*pre,*u;p=l;printf("输入m:");scanf("%d",&m);printf("%40s","游戏开始");while(p->next!=p){pre=p;p=p->next;if(p==l){pre=p;p=p->next;}k++;if(k==m){printf("%d",p->i);m=p->data;pre->next=p->next;u=p;free(u);p=pre;k=
9、0;}}printf("%40s","游戏结束");}voidexitgame(){printf("%40s","再见!!");}8、主函数:voidmain(){intselect;CLinkListlist;init_CLinkList(&list);do{printf("%s%15s%15s%15s%15s","","1:创建","2:显示","3:游戏","4:退出");printf("