第一篇:数据结构实习报告
一、需求分析
1、程序所实现的功能;
2、程序的输入,包含输入的数据格式和说明;
3、程序的输出,程序输出的形式;
4、测试数据,如果程序输入的数据量比较大,需要给出测试数据;
5、合作人及其分工
二、设计说明
1、主要的数据结构设计说明;
2、程序的主要流程图;
3、程序的主要模块,要求对主要流程图中出现的模块进行说明
4、程序的主要函数及其伪代码说明(不需要完整的代码);
5、合作人设计分工
三、上机结果及体会
1、合作人编码分工
2、实际完成的情况说明(完成的功能,支持的数据类型等);
3、程序的性能分析,包括时空分析;
4、上机过程中出现的问题及其解决方案;
5、程序中可以改进的地方说明;
6、程序中可以扩充的功能及设计实现假想;说明:
1、如果程序比较大,可以将设计说明分为概要设计和详细设计两部分。概要设计主要负责程序的流程、模块、抽象数据类型设计;详细设计负责程序的数据类型定义和主要函数的说明。
2、设计说明中,不需要写出代码或者模块的详细代码,只需要写出主要函数的伪代码说明。
第二篇:数据结构实习报告
数据结构课程设计的实习报告怎么写呀,请求做过课设的同学发一篇范文过来谢谢-_-规范实习报告的开头应给出题目、班级、姓名、学号和完成日期,并包括以下七个内容:
1、需求分析以无歧义的陈述说明程序设计的任务,强调的是程序要做什么?明确规定:(1)输入的形式和输入值的范围;(2)输出的形式;(3)程序所能达到的功能;(4)测试数据:包括正确地输入及其输出结果和含有错误的输入及其输出结果,数据结构实习报告。
2、概要设计说明本程序中用到的所有抽象数据类型的定义、主程序的流程以及各程序模块之间的层次(调用)关系。
3、详细设计实现概要设计中定义的所有数据类型,对每个操作只需要写出伪码算法;对主程序和其他模块也都需要写出伪码算法(伪码算法达到的详细程度建议为:按照伪码算法可以在计算机键盘直接输入高级程序设计语言程序);画出函数的调用关系图。
4、调试分析内容包括:(1)调试过程中遇到的问题是如何解决的以及对设计与实现的回顾讨论和分析;(2)算法的时空分析(包括基本操作和其他算法的时间复杂度和空间复杂度的分析)和改进思想;(3)经验和体会等,实习报告《数据结构实习报告》。
5、用户使用说明说明如何使用你编写的程序,详细列出每一步操作步骤。
6、测试结果列出你的测试结果,包括输入和输出。这里的测试数据应该完整和严格,最好多于需求分析中所列。
7、附录题目:约瑟夫-实习报告尺寸:约瑟夫-实习报告.doc目录:
一、需求分析
二、概要设计
三、程序具体设计及函数调用关系
四、调试分析
五、测试结果原文:实习报告题目:约瑟夫(Joseph)问题的一种描述是:编号为1,2,.,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个开始重新从1报数,如此下去,直至年有人全部出列为止。试设计一个程序求出出列顺序。班级:姓名:学号:完成日期:
一、需求分析1.本演示程序中,利用单向循环链表存储结构存储约瑟夫环数据(即n个人的编号和密码)。2.演示程序以用户和计算机的对话方式执行,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入演示程序中需要输入的数据,运算结果显示在其后。3.程序执行的命令包括:1)构造单向循环链表;2)4.测试数据m的初值为20;n=7,7个人的密码依次为:3,1,7,2,4,8,4,首先m值为6(正确的出列顺序为6,1,4,7,2,1,3,5)。
二、概要设计1.单向循环链表的抽象数据类型定义为:ADT List{数据对象:D={ai|ai∈正整数,I=1,2,.,n,n≥0}数据关系:R1={ai-1,ai|,ai-1,ai∈D,I=1,2,.,n}基本操作:Init List(&L)操作结果:构造一个空的线性表L。List Insert(&L,i,e)初始条件:线性表L已存在,1≤i≤List Length(L)+1.操作结果:在L中第i个位置之前插入新的数据无素e,L长度加1。List Delete(&L,i,&e)初始条件:线性表L存在非空,1≤i≤List Length(L).操作结果:删除L的第i个元素,并用e返回其值,L长度减1。2.程序包含四个模块:1)主程序模块:void main(){.
第三篇:数据结构实习报告
数据结构第六次作业p134
——11411203张玉
24.template
void SeqQueue
if(IsFull()==true){
maxSize=2*maxSize;
elements[rear]=x;
rear=(rear+1)%maxSize;
}
elements[rear]=x;
rear=(rear+1)%maxSize;
};
template
bool SeqQueue
if(rear<=maxSize/4){
maxSize=maxSize/2;
x=elements[front];
front=(front+1)%maxSize;
}
x=elements[front];
front=(front+1)%maxSize;
return true;
};
29.// 利用优先级队列实现栈和队列
#include
template
template
template
class PQueueNode
{
friend class PQueue
friend class Queue
public:
PQueueNode(T &value, int newpriority, PQueueNode
virtual int GetPriority(){ return priority;}//取得结点优先级
virtual PQueueNode
virtual void SetData(T& value){ data = value;}//修改结点数据
virtual void SetPriority(int newpriority){ priority = newpriority;} //修改结点优先级
virtual void SetLink(PQueueNode
T data;//数据
int priority;//优先级
PQueueNode
};
//优先级队列的类定义
template
class PQueue
{
friend class Stack
friend class Queue
public:
PQueue():front(NULL), rear(NULL){}//构造函数
virtual ~PQueue(){ MakeEmpty();}//析构函数
virtual void Insert(T &value, int newpriority);//插入新元素value到队尾 virtual T Remove();//删除队头元素并返回 virtual T Get();//读取队头元素的值 virtual void MakeEmpty();//置空队列
virtual int IsEmpty(){ return front == NULL;}//判队列空否private:
PQueueNode
};template
void PQueue
{
//将优先级队列置空
PQueueNode
while(front!= NULL)//链不空时, 删去链中所有结点
{
//循链逐个删除
q = front;
front = front->link;
delete q;
}
rear = NULL;//队尾指针置空
}template
void PQueue
{
//插入函数
PQueueNode
front = rear = q;//队列空时新结点为第一个结点
else
{
PQueueNode
while(p!= NULL && p->priority >= newpriority)//队列中按优先级从大到小链接{
pr = p;
p = p->link;
}
if(pr == NULL)
{
//插入在队头位置
q->link = front;
front = q;
}
else
{
q->link = p;
pr->link = q;//插入在队列中部或尾部
if(pr == rear)
rear = q;
}
}
}
//删除队头元素并返回
template
T PQueue
{
if(IsEmpty())
return NULL;PQueueNode
front = front->link;//将队头结点从链中摘下
T &retvalue = q->data;
delete q;
if(front == NULL)
rear = NULL;return retvalue;
}
//读取队头元素的值
template
T PQueue
if(IsEmpty())
return NULL;
else
return front->data;
}
//(1)栈的定义与实现
template
class Stack:public PQueue
{
//栈类定义
public:
Stack():PQueue
void Insert(T & value);//插入新元素value到队尾
};template
void Stack
{
//插入函数
PQueueNode
else
{
//插入在前端
q->link = front;
front = q;
}
}//--------------------------Queue //(2)队列的定义与实现
template
class Queue:public PQueue
{
//队列类定义
public:
Queue():PQueue
void Insert(T & value);//插入新元素value到队尾
};template
void Queue
{
//插入函数
PQueueNode
if(IsEmpty())
front = rear = q;//队列空时新结点为第一个结点
else
rear = rear->link = q;//插入在队尾位置
void main(){
Stack
int n = 1;
aStack.Insert(n);aQueue.Insert(n);}
第四篇:数据结构实习报告
附件:
实习报告格式,如下:
数据结构实习报告
班级: 姓名:
xxx(20121514101)
xxx(20121514101)
xxx(20121514101)
指导教师:
日期:
题目
一、问题描述(把你所选的题目及要求说一下)
二、概要设计(抽象数据类型定义)
三、详细设计(主要算法和函数间的调用关系)
四、调试分析(调式过程中出现的问题及如何改正)
五、心得体会(组内成员的分工及实习期间的体会)
六、用户手册(系统的使用方法介绍)
可参照习题集上的实习报告格式。
第五篇:数据结构实习报告
数据结构实习报告
班级:13软件二班
姓名:殷健 学号:1345536225
子集和数问题
1:问题描述
子集和数问题1:子集和问题的为〈W,c〉。其中,W={w1,w2,...,wn}是一个正整数的集合,子集和数问题判定是否存在W的一个子集W1,使得∑W1=c∑W(0 程序中设计了函数void computeSumofSub(int s,int k,int r),其意义是从第k项开始,如果s(已经决策的和数)和w[k](当前元素)之和为和数,就把结果输出来,否则如果s与,w[k],w[k+1]之和小于和数,则调用computeSumofsub(s+w[k],k+1,r-w[k]),意为选择此结点的左分支,再判断s和后面所有元素之和是否不小于M(所有的加起来都小,必定无解),并且s+w[k+1]<=M(由于输入的数据要求是从小到大且无重复元素,所以若s+w[k+1])>M,也是无解),若条件符合即调用computeSumofSub(s,k+1,r-w[k]),即选择当前结点的右分支。 算法展示: #include int m;int x[M];public: SumOfSub(int a[], int b, int n){ for(int i=0;i };void main(){ int sum=0;int w[M];srand((unsigned)time(NULL)); for(int i=0;i } cout<<“随机数组为:”;cout< cout<<“符合条件的子集为:”;for(int i=0;i<=k;i++){ } cout< } cout<<“数组元素总和为:”< 复杂性分析: 对于不同的输入结果,算法的执行次数有所不同,最好情况是n,最坏情况是n*2^n。尽管差异很大,但当n很大时,对某些输入而言,回溯法仍可在短时间内求解。其它说明: 按书中所讲的约束条件,程序中所有变量都是整型,输入的各元素要从小到大输入,而且不能有重复的元素。若是想要无序输入,可以程序中加入程序1.c的归并排序算法,对输入的数组排序即可。 拓展一 问题描述: 子集和数问题拓展一:子集和问题的为〈W,c,p〉。其中,W={w1,w2,...,wn}是一个正整数的集合,子集和数问题判定是否存在W的一个子集W1,使得∑W1=c∑W(0 问题分析: 增加一个数组p,使得p的每个元素与w对应元素关系为pi=Wi+10;最后结果W子集中元素个数越多,则p和最大,但也可以将每个符合条件子集对应P集合的元素和计算出做个比较,然后输出最大的再对应原W子集。 算法演示 #include int N[M];int max;int j;public: SumOfSub(int a[], int b, int n){ max=0;j=0; for(int i=0;i w[i]=a[i]; p[i]=a[i]+10; } m = b; x[0]=n;} void computeSumOfSub(int s, int k, int r){ x[k] = 1;if(s+w[k] == m){ printResult(k);cout<<“ ”; } else if(s+w[k]+w[k+1] <= m){ computeSumOfSub(s+w[k],k+1,r-w[k]);} if(s+r-w[k]>=m&&s+w[k+1]<= m){ x[k] = 0;computeSumOfSub(s, k+1, r-w[k]);} } void printResult(int k){ int S=0;int i; cout<<“符合条件的子集为:”; for(i=0;i<=k;i++){ if(x[i] == 1){ S=S+p[i]; cout< } cout<<“p和为:”< cout< if(S>max){ max=S; int J=0; for(i=0;i<=k;i++){ if(x[i]==1){ N[J]=w[i]; J++; } } j=J; } } void special(){ cout< for(int i=0;i cout< } cout< for(int i=0;i w[i]=rand(); if(w[i]==0){ w[i]=rand(); } sum=sum+w[i];} cout<<“随机数组为:”;for(i=0;i cout< r += w[i];} sumOfSub.computeSumOfSub(0, 0, r); sumOfSub.special();} 运行结果 复杂性分析 对于不同的输入结果,算法的执行次数有所不同,最好情况是n,最坏情况是n*2^n。尽管差异很大,但当n很大时,对某些输入而言,回溯法仍可在短时间内求解。 拓展二 问题描述 子集和数问题拓展一:子集和问题的为〈W,c,P〉。其中,W={w1,w2,...,wn}是一个正整数的集合,子集和数问题判定是否存在W的一个子集W1,使得∑W1=c∑W(0 问题分析 增加一个数组随机数组P,每个符合条件子集对应P集合的元素和计算出做个比较,然后输出最大的再对应原W子集。 算法演示 #include int x[M];int N[M];int max;int j;public: SumOfSub(int a[], int b, int n){ max=0; j=0; cout<<“随机数组p为:”; for(int i=0;i w[i]=a[i]; p[i]=rand(); cout< } cout< m = b; x[0]=n;} void computeSumOfSub(int s, int k, int r){ x[k] = 1;if(s+w[k] == m){ printResult(k);cout<<“ ”; } else if(s+w[k]+w[k+1] <= m){ computeSumOfSub(s+w[k],k+1,r-w[k]);} if(s+r-w[k]>=m&&s+w[k+1]<= m){ x[k] = 0;computeSumOfSub(s, k+1, r-w[k]);} } void printResult(int k){ int S=0;int i; cout<<“符合条件的子集为:”; for(i=0;i<=k;i++){ if(x[i] == 1){ S=S+p[i]; cout< } cout<<“p和为:”< cout< if(S>max){ max=S; int J=0; for(i=0;i<=k;i++){ if(x[i]==1){ N[J]=w[i]; J++; } } j=J; } } void special(){ cout< for(int i=0;i cout< } cout< for(int i=0;i w[i]=rand(); if(w[i]==0){ w[i]=rand(); } sum=sum+w[i];} cout<<“随机数组w为:”;for(i=0;i cout< r += w[i];} sumOfSub.computeSumOfSub(0, 0, r); sumOfSub.special();} 运行结果 复杂性分析 对于不同的输入结果,算法的执行次数有所不同,最好情况是n,最坏情况是n*2^n。尽管差异很大,但当n很大时,对某些输入而言,回溯法仍可在短时间内求解。