数据结构Ⅰ课程设计 约瑟夫环.docx
《数据结构Ⅰ课程设计 约瑟夫环.docx》由会员分享,可在线阅读,更多相关《数据结构Ⅰ课程设计 约瑟夫环.docx(12页珍藏版)》请在冰豆网上搜索。
数据结构Ⅰ课程设计约瑟夫环
数据结构Ⅰ课程设计
约瑟夫环问题
2014年01月04日
目录
目录2
第1章问题描述3
第2章基本要求4
第3章概要设计5
3.1数据结构的设计5
3.2算法的设计6
3.3抽象数据类型的设计8
第4章详细设计10
4.1设计抽象数据类型对应的C++类的定义10
4.2设计每个成员函数11
4.3设计主函数12
第5章运行与测试13
5.1程序运行环境13
5.2测试数据及测试结果13
5.3程序运行结果截图16
第6章总结与心得17
参考文献18
附录程序源代码19
第1章问题描述
编号是1,2,3……n的n个人按照顺时针方向围坐一圈,每个人持有一个密码(正整数)。
一开始任选一个正整数作为报数上限值m,从第一个人开始顺时针方向自1开始顺序报数,报到m时停止报数。
报m的人出列,将他的密码作为新的m值,从他在顺时针方向的下一个人开始重新从1报数,如此下去,直到所有人全部出列为止。
设计一个程序来求出出列顺序。
第2章基本要求
1)建立数据模型,确定存储结构;
2)对任意n个人,密码为m,实现约瑟夫环问题;
3)出圈的顺序可以依次输出。
第3章概要设计
3.1数据结构的设计
解决此问题需要用到单链表的数据结构。
约瑟夫环问题,从确定的初报数开始进行,顺着这一方向向前如此循环,若能找到新的密码m所对应的数值则直接输出,若不能找到,继续向下依次寻找,直到找到密码m所对应的数值,再输出,如此循环。
约瑟夫环问题中的数据是人所在的位置,而这种数据存在“第一元素、最后元素”,并且存在唯一的前驱和后继,完全符合单链表的特点。
很显然,这需要应用单循环链表的知识。
单链表的基本思想就是用指针表示结点之间的逻辑关系,要确定指针变量p,结点p,指针p和L。
3.2算法的设计
按照模块进行划分:
(1)链表节点设计
structLnode{
intpwd;//密码
intbianhao;//编号
structLnode*next;
};
(2)采用头插法构造链表,由此必须倒着输入个人的密码和编号,由此可计一个线性表作为缓存暂时保存个人密码和编号。
a[n]=pwd。
n为编号,pwd为n的人的密码。
(3)将上述2中缓存的数据从a[n]到a[1]一次赋给链表L:
Lnode*L,*p;
L=newLnode;
L->next=NULL;
for(i=num;i>0;i--){
p=newLnode;
p->pwd=a[i-1];
p->bianhao=i;
p->next=L->next;
L->next=p;
}
(4)用循环模拟报数的过程
p=L;
while(num>0){
for(i=1;ip=p->next;
if(p->next==NULL){
p->next=L->next;
}
}
Lnode*temp;
temp=p->next;
cout<bianhao<<"\n";
p->next=temp->next;
m=temp->pwd;
free(temp);
num--;
}
num是用来控制循环次数的变量,值为总人数n,每完成一次删除操。
即每有一个人出列,num减1。
循环中设置了中间变量temp用来存储要删除的结点的指针,以保证删除操作不会导致链表指针无法找到下一结点。
结束后free掉temp。
(5)删除结点,即找到出列对象的同时输出这个结点的数据域:
编号和密码!
3.3抽象数据类型的设计
采用类C语言定义相关的数据类型
structLnode
{
intpwd;//每个人持有的密码
intbianhao;//人员编号
structLnode*next;//指向下一个结点
};
第4章详细设计
4.1设计抽象数据类型对应的C++类的定义
(1)链表节点设计
structLnode{
intpwd;//密码
intbianhao;//编号
structLnode*next;
};
(2)将数据从a[n]到a[1](运用结点、链表指针)一次赋给链表L:
Lnode*L,*p;
L=newLnode;
L->next=NULL;
for(i=num;i>0;i--){
p=newLnode;
p->pwd=a[i-1];
p->bianhao=i;
p->next=L->next;
L->next=p;
}
(3)运用循环模拟报数过程
p=L;
while(num>0){
for(i=1;ip=p->next;
if(p->next==NULL){
p->next=L->next;
}
}
Lnode*temp;
temp=p->next;
cout<bianhao<<"\n";
p->next=temp->next;
m=temp->pwd;
free(temp);
num--;
}
4.2设计每个成员函数
intpwd;
intbianhao;
structLnode*next;
将密码和编号存入程序中,通过结点指针对所需的数据进行调用。
Lnode*temp
找到出列对象的同时,输出这个结点的数据域,存储要删除结点,直到程序运行完毕。
4.3设计主函数
主函数
{
定义输入人数和密码
输入相应的初始报数
输入操作完成后,输出相应数据
}
第5章运行与测试
5.1程序运行环境
Windows7系统下在VC++6.0开发平台进行程序的运行与测试。
5.2测试数据及测试结果
数据1:
输入人数5,初次报数3,密码依次为:
26847,测试结果:
32154
数据2:
输入人数8,初次报数6,密码依次为:
34871645,测试结果:
64573128
数据3:
输入人数13,初次报数9,密码依次为:
4637982315758,测试结果:
91028131261137451
5.3程序运行结果截图
数据1:
程序清单
运行结果:
32154
数据2:
程序清单
运行结果:
64573128
数据3:
程序清单
运行结果:
91028131261137451
第6章总结与心得
我的这次数据结构课程设计的题目是《约瑟夫环问题》,通过对该题目的设计,使我加深了对数据结构的理解。
做什么事情,都要对认真,既然是该你做的事,肯定是你应该有这个能力,即使能力不够,也是应该借这个机会来培养。
所以放心大胆地做,对自己有信心,就有动力。
有人说,世上的事就怕认真二字。
确实,做什么,只是认真地去做,踏踏实实,戒躁戒躁,静静地思考,慢慢地进步,真的是天下无难事。
这就是我这次课程设计中得到的最大的体会,受益匪浅。
通过课程设计我的收获如下:
1、巩固和加深了对数据结构的理解,提高综合运用本课程所学知识的能力。
2、培养了我选用参考书,查阅手册及文献资料的能力。
培养独立思考,深入研究,分析问题、解决问题的能力。
3、通过实际编译系统的分析设计、编程调试,掌握应用软件的分析方法和工程设计方法。
4、通过课程设计,培养了我严肃认真的工作作风,逐步建立正确的生产观念、经济观念和全局观念。
根据我在课程设计中遇到得问题,我将在以后的学习过程中注意以下几点:
1、认真上好专业实验课,多在实践中锻炼自己。
2、写程序的过程中要考虑周到,严密。
3、认真的学习课本知识,并在此基础上学会灵活运用。
参考文献
[1]胡明,王涛等著.数据结构(C++版)[M].北京:
清华大学出版社,2011.
[2]谭浩强著.C程序设计(第四版)[M].北京:
清华大学出版社,2005.
[3]谭浩强著.C++程序设计[M].北京:
清华大学出版社,2004.
附录程序源代码
#include
usingnamespacestd;
structLnode{
intpwd;
intbianhao;
structLnode*next;
};
intmain()
{
inti=0;
intnum,m;
cout<<"输入人数:
"<<"\n";
cin>>num;
cout<<"输入初始报数:
"<<"\n";
cin>>m;
cout<<"输入密码:
"<<"\n";
inta[100];
for(i=0;icin>>a[i];
Lnode*L,*p;
L=newLnode;
L->next=NULL;
for(i=num;i>0;i--){
p=newLnode;
p->pwd=a[i-1];
p->bianhao=i;
p->next=L->next;
L->next=p;
}
p=L;
while(num>0){
for(i=1;ip=p->next;
if(p->next==NULL){p->next=L->next;
}
}
Lnode*temp;
temp=p->next;
cout<bianhao<<"\n";
p->next=temp->next;
m=temp->pwd;
free(temp);
num--;
}
system("pause");
return0;
}