数据结构实习报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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={|ai-1,ai∈D, i=1,2, …,n }

基本操作:

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("---------------------------------------------------------

相关文档
最新文档