数据结构实习报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计说明书
设计题目:数据结构课程设计
专业:班级:
设计人:
山东科技大学
2015 年 1 月 9 日
实习一约瑟夫环
一、需求分析
1.本演示程序中,输入的数均为正整数,先输入m的初值,在输入人数n,最后依次输入n个人的密码,以回车键结束。输出结果为出列顺序和出列人的密码。
2.演示程序以用户和计算机的对话方式执行,即在计算机终端上显示提示信息之后,由用户在键盘上输入演示程序中规定的运算命令;相应的输入数据和运算结果显示在其后。
3.程序执行的命令包括:
1)输出设计课题;
2)创建单向循环链表;
3)利用递归;
4)输出出列顺序;
5)结束;
4.测试数据
m=20;n=7;密码依次为3,1,7,2,4,8,4;
出列顺序为:6,1,4,7,2,3,5。
二、概要设计
为实现上序程序功能,应使用单向循环链表。
1.抽象数据类型线性表的定义如下:
ADTList{
数据对象:D={ai|ai∈ElemSet, i=1,2, …,n, n≥0}
数据关系:R1={
基本操作:
IninList(&L)
操作结果:构造一个空的线性表L。
GetElem(L,i,&e)
初始条件:线性表L已存在,1≤i≤ListLength(L).
操作结果:用e返回L中第i个数据元素的值。
ListDelete(&L,i,&e)
初始条件:线性表L已存在且非空,1≤i≤ListLength(L).
操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1。}ADT List
2.本程序包含三个模块:
1)主程序模块:
int main()
{
初始化;
接受命令;
处理命令;
输出结果;
退出程序;
}
2)初始化模块;
3)单链表循环模块。
各模块之间的调用关系如下:
主函数模块
初始化模块单链表循环模块
三、详细设计
1.宏定义
#define OVERFLOW 0
#define OK 1
2.线性表的单链表类型
typedef struct lnode//构造结构体
{
int password;//密码
int order;//编号
struct lnode * next;//指针域
} lnode,* linklist;//建立结点
3.函数的调用关系图反映了演示程序的层次结构:
main
joseph
四、调试分析
1.本程序比较简单,功能在main 函数中实现,还利用了以前学过的递归运算,很实用。
2.调试过程中,由于指针使用不当多次出现错误,对指针的设计还需要熟练掌握。
3.本程序的模块划分不是很合理,程序还有待优化。
4.算法的时空分析
运用递归求解,降低了时间消耗,时间复杂度是O(n);
空间复杂度是O(n)。
五、用户手册
1.本程序的运行环境是DOS操作系统。
2.进入演示程序后即显示文本方式的用户界面:
3.按要求m的初值,人数及人的密码输入,以回车键结束。
六、测试结果
按回车键之后输出结果;
七、附录
程序源代码
#include
#include
#include
#define OVERFLOW 0
#define OK 1
typedef struct lnode//构造结构体
{
int password;//密码
int order;//编号
struct lnode * next;//指针域
} lnode,* linklist;//建立结点
void joseph(linklist p,int m,int x,int j)//递归计算{
linklist q;
int i;
if(x==0) return;
q=p;
m%=x;
if(m==0)m=x;
for(i=1; i<=m; i++)
{
p=q;
q=p->next;//寻找q的头结点
}
p->next=q->next;//释放结点q
i=q->password;//赋值i
printf("第%d次出列的人编号是%d;",j,q->order);//有人出列
printf("m的值变为%d\n",i);//m改变
j++;//计算出列人数
free(q);//释放q中所有数值
joseph(p,i,x-1,j);//重新报数
}
void welcome()
{
printf("--------------------------------------------------------------------------------\n");
printf(" *_*约瑟夫问题*_*\n\n"); printf("---------------------------------------------------------