数据结构实验约瑟夫环..
- 格式:doc
- 大小:444.00 KB
- 文档页数:18
数据结构课程设计题目
1.目的
数据结构是研究数据元素之间的逻辑关系的一门课程,以及数据元素及其关系在计算机中的存储表示和对这些数据所施加的运算。该课程设计的目的是通过课程设计的综合训练,培养分析和编程等实际动手能力,系统掌握数据结构这门课程的主要内容。
2.内容
本次课程设计的内容是用单循环链表模拟约瑟夫环问题,循环链表是一种首尾相接链表,其特点是无须增加存储容量,仅对表的链接方式稍作改变,使表处理更加灵活,约瑟夫环问题就是用单循环链表处理的一个实际应用。通过这个设计实例,了解单链表和单循环链表的相同与不同之处,进一步加深对链表结构类型及链表操作的理解。
约瑟夫环问题的描述是:设编号为1,2,…,n的n个人按顺时针方向围坐一圈,每个人持有一正整数密码。开始时选择一个正整数作为报数上限m,从第一个人开始顺时针方向自1起顺序报数,报到m时停止报数,报m的人出圈,将他的密码作为新的m值,从他在顺时针方向上的下一个人起重新从1报数。如此下去,直到所有人都出圈为止。令n最大值为100。要求设计一个程序模拟此过程,求出出圈的编号序列。
3.设计:
1)对设计内容进行分析
2)逻辑设计
1、循环链表抽象数据类型定义
typedef struct LNode//定义单循环链表中节点的结构 { int num;//编号 int pwd;//password
struct LNode *next;//指向下一结点的指针
}LNode;
2、本程序包含一下几个模块 (1)构造结点模块
LNode *createNode(int m_num,int m_pwd) {
图2 约瑟夫环原理演示图
LNode *p;
p=(LNode *)malloc(sizeof(LNode));//生成一个结点
p->num=m_num;//把实参赋给相应的数据域
p->pwd=m_pwd;
p->next=NULL;//指针域为空
return p;
}
(2)创建链表模块
void createList(LNode *ppHead,int n)
(3)出队处理模块
void jose(LNode *ppHead,int m_pwd)
(4)约瑟夫环说明输出模块
void instruction()
(5)菜单模块
void menu()
(6)主函数模块
int main()
函数的调用关系图如下:
3)具体设计流程:1.主函数
图4 主函数数据流程图
根据流程图,主函数程序如下:
int main()
{
int n,m,x;
LNode *ppHead=NULL;
menu();
for(;;){
printf("\n请选择要执行的操作:");
scanf("%d",&x);
system("cls");
switch(x){
case 1:
printf("************************************************************* ***\n");
printf("约瑟夫环:\n");
printf(" 编号为1,2,3,4…,n的n个人按顺时针方向围坐一圈,每人持有一个密\n");
printf("码(正整数).一开始任选一个正整数作为报数的上限值m,从第一个人开始\n");
printf("按顺时针方向自1开始顺序报数,报到m时停止.报m的人出列,将他的密码\n");
printf("m作为新的m值,从他在顺时针方向上的下一人开始重新从1报数,如此下去,\n");
printf("直到所有人全部出列为止.编程打印出列顺序.\n");
printf("************************************************************* ***\n");
main();
break;
case 2:
printf("\n请输入总人数n:");
scanf("%d",&n);
printf("请输入开始上限数m:");
scanf("%d",&m);
createList(&ppHead,n);
printf("\n");
printf("出队顺序:\n");
jose(ppHead,m);
printf("\n约瑟夫环游戏结束!\n");
main();
break;
case 0:
exit(0);
default:
system("cls");
printf("\n您选择的操作有误,请重新选择...\n\n\n");
main();
}
}
return 0;
}
2.链表的创建
图5 创建链表函数的数据流程图
/*创建单向循环链表ppHead,人数个数为n,并输入每个人的密码值,若建立失败则生成头结点,让cur指向他,若建立成功则插入结点P,cur指向的数据元素为p,后续为"空"的节点,再把P插入循环链表ppHead中*/
根据流程图,创建链表函数程序如下:
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)//如果头结点为空
{