数据结构实习报告模板.docx
《数据结构实习报告模板.docx》由会员分享,可在线阅读,更多相关《数据结构实习报告模板.docx(24页珍藏版)》请在冰豆网上搜索。
数据结构实习报告模板
数据结构实习报告模板
篇一:
数据结构实习报告模板
数据结构实习报告
题目:
班级:
姓名:
完成日期:
目录
一、问题描述:
文学研究人员需要统计某篇英文小说中某些形容词的出现次数和位置。
试写一个实现这一目标的文字统计系统,称为“文学研究助手”。
英文小说存于一个文本文件中。
待统计的词汇集合要一次输入完毕,即统计工作必须在程序的一次运行之后就全部完成。
程序的输出结果是每个词的出现次数和出现位置所在行的行号,格式自行设计。
二、需求分析:
1、文本串非空且以文件形式存放,统计匹配的词集非空。
文件名和词集均用户从键盘输入;
2、“单词”定义:
由字母构成的字符序列,中间不含空格字符且区分大小写;
3、待统计的“单词”在文本串中不跨行出现,它或者从行首开始,或者前置若干空格字符;
4、在计算机终端输出的结果是:
单词,出现的次数,出现的位置所在行的行号,同一行出
现两次的只输出一个行号;
5、测试数据:
将实验的源程序作为测试文件,从中任意选取“单词”作为测试的词集。
三、概要设计:
采用截取字符串、比较字符串的模式来完成“单词匹配比较”,从而统计出其出现的位置和次数。
1、数据结构定义:
程序将涉及到如下两个线性表结构的数据类型,用类C语言描述如下:
(1)定义从文本读取的“单词串”类型:
ADTFileString{
数据对象:
D={Si|Si∈标准c++字符串集合,i=1,2,3,…….,n,n≥0};数据关系:
R1={}|Si-1,Si∈D,i=1,2,3,…..,n}基本操作:
createFileString(FSList&FSL);
初始条件:
已知一个空的“文本单词串表头”;
操作结果:
生成一个空的“文本单词串序列”;
insertFileString(FSList&FSL,stringstr,introw);
初始条件:
FSL为文本字符串序列的表头str为一个标准的c++字符串,row代表了字符
串出现的行数;
操作结果:
将str插入到文本字符串序列中,不需要排序;若FSL为空表头,则创建一个
字符串序列;否则插在字符串序列尾部;
getFSLength(FSListFSL);
初始条件:
FSL为文本字符串序列的表头;
操作结果:
获取以FSL为表头的文本字符串的长度
printFileString(FSListFSL);
初始条件:
FSL为文本字符串序列的表头;
操作结果:
打印以FSL为表头的文本字符串中的所有字符串;
readFile(FSList&FSL);
初始条件:
FSL为文本字符串序列的表头;
操作结果:
从文件中读取字符串序列,并将其保留在以FSL为表头的字符串序列中;clearFileString(FSList&FSL);
初始条件:
FSL为文本字符串序列的表头;
操作结果:
以FSL为表头的文本字符串序列被清空;
}ADTFileString
(2)定义从键盘读取的“单词串”类型:
ADTKeyString{
数据对象:
D={Si|Si∈标准c++字符串集合,i=1,2,3,…….,n,n≥0};
数据关系:
R1={}|Si-1,Si∈D,i=1,2,3,…..,n}基本操作:
createKeyString(KSList&KSL);
初始条件:
已知一个空的“键盘单词串表头”;
操作结果:
生成一个空的“键盘单词串序列”;
insertKeyString(KSList&KSL,stringstr,introw);
初始条件:
KSL为键盘字符串序列的表头str为一个标准的c++字符串,row代表了字符
串出现的行数;
操作结果:
将str插入到键盘字符串序列中,不需要排序;若KSL为空表头,则创建一个
字符串序列;否则插在字符串序列尾部;
getKSLength(KSListKSL);
初始条件:
KSL为键盘字符串序列的表头;
操作结果:
获取以KSL为表头的键盘字符串的长度
printKeyString(KSListKSL);
初始条件:
KSL为键盘字符串序列的表头;
操作结果:
打印以KSL为表头的键盘字符串中的所有字符串;
readKey(KSList&KSL);
初始条件:
KSL为文本字符串序列的表头;
操作结果:
从键盘中读取字符串序列,并将其保留在以KSL为表头的字符串序列中;clearKeyString(KSList&KSL);
初始条件:
KSL为文本字符串序列的表头;
操作结果:
以KSL为表头的文本字符串序列被清空;
}ADTKeyString
2、模块设计:
篇二:
数据结构实习报告
《数据结构》
上机报告
学号:
XX1002072
班级序号:
116131-12
姓名:
陶剑浩
指导老师:
吴亮
成绩:
中国地质大学(武汉)
信息工程学院信息工程系
XX年12月
【实习一】线性表及其应用
【问题描述】
大数运算——计算n的阶乘(n>=20)。
【基本要求】
(1)数据的表示和存储:
()累积运算的中间结果和最终的计算结果的数据类型要求是整型——这是问题本身的要求;
()试设计合适的存储结构,要求每个元素或结点最多存储数据的3位数值。
(2)数据的操作及其实现:
基于设计的存储结构实现乘法操作,要求从键盘上输入n值,在屏幕上显示最终计算结果。
【实现提示】
1)设计数据的存储结构:
介于阶乘运算的精确性以及实型数据表示的不精确性,本题不能采用实型表示累积运算的中间结果和最终的计算结果,而只能用整型。
然而由于普通整型和长整型所能表述数的范围受其字长的限制,不能表示大数阶乘的累积结果,故必须设计一个合适的数据结构实现对数据的存储,例如可以让每个元素或结点存储数据的若干位数值。
从问题描述不难看出n值为任意值,故为使程序尽量不受限制,应采用动态存储结构
【可采用的数据结构】
(1)采用链式存储结构实现(普通单链表,循环单链表,普通双项链表和双向循环链表中任选一种结构)。
(2)采用动态数组实现。
【设计思想】
使用链表形式进行处理,测试数据:
输入:
(1)n=20,
输出:
n!
=243290XX176640000
输入:
(2)n=30,
输出:
n!
=265252859812191058636308480000000
【测试】
【源代码】//大数运算.cpp:
定义控制台应用程序的入口点。
//
#include""
#include
usingnamespace
std;
template
classChain;
template
classChainNode
{
};
template
classChain
{
public:
};
//析构函数(删除链表的所有节点)
template
Chain:
:
~Chain()
{
}
//确定链表的长度
templateChainNode*next;while(first){}next=first->link;deletefirst;first=next;Chain(){first=0;};~Chain();boolIsEmpty()const{returnfirst==0;}intLength()const;boolFind(intk,T&x);Chain&Insert(intk,constT&x);Chain&Change(intk,Tx);Chain&Delete(intk,T&x);Chain&Search(constT&x)const;intOutPut();ChainNode*first;friendChain;Tdata;ChainNode*link;private:
private:
intChain:
:
Length()const
{
}
//在链表中查找第K个元素
template
boolChain:
:
Find(intk,T&x)
{
}
//向链表中插入元素
template
Chain&Chain:
:
Insert(intk,constT&x){
ChainNode*p=first;for(intindex=1;indexlink;ChainNode*y=newChainNode;y->data=x;if(k){}else{}y->link=first;first=y;y->link=p->link;p->link=y;ChainNode*current=first;intindex=0;while(indexdata;returntrue;}returnfalse;current=current->link;index++;ChainNode*current=first;intlen=0;while(current){}returnlen;len++;current=current->link;
篇三:
数据结构实训报告样本
(数据结构实训报告)
目录
一、实训目的...........................................................1二、实训题目...........................................................1三、实训步骤...........................................................2四、实训内容...........................................................2五、实训心得..........................................................19六、参考文献..........................................................19
一、实训目的
通过实训,对所学数据结构和程序设计的基本知识和基本理论有更进一步的了解和认识,将理论和实际相结合,能够根据数据对象的特性,学会数据组织的方法,能把现实世界中的实际问题在计算机内部表示出来。
主要是培养学生综合利用C语言进行程序设计的能力和创新能力以及综合解决问题的能力。
运用算法分析与程序设计的一般方法进行实际项目的开发。
本次实训尽量选取与实际结合紧密或学生比较感兴趣的项目,本次实训学生需要具备熟练的程序设计基础、数据结构和计算机应用基础知识,具备程序编写、调试的基本能力,具有一定的文字表达和报告撰写能力,具备办公软件使用能力。
通过实训,考查语言基本概述掌握是否牢固,并考查与后续课程较为密切的结构体,链表,文件的运用熟练程度,加强对基本概念的理解和复习,最重要的是了解基本软件的设计步骤,还有对软件调试的掌握。
能够根据数据对象的特性,学会数据组织的方法,能把现实世界中的实际问题在计算机内部表示出来,并培养基本的、良好的程序设计技能。
二、实训题目
(一)单项题目1、二叉树遍历
【问题描述】建立二叉树,实现二叉树的先序遍历、中序、后序和层序遍历(用递归或非递归的方法都可以)。
【要求】编写菜单程序。
能够输入二叉树的各个结点,并能够输出用不同方法遍历的遍历序列;分别建立二叉树存储结构的输入函数、输出先序遍历序列的函数;输出中序遍历序列的函数;输出后序遍历序列的函数;输出层序遍历序列的函数。
(二)综合题目1、图书管理系统
【问题描述】建立一个图书信息文件,包括书号(num)、书名(bookname)、作者(name)、出版社(publish)、价格(price)等。
【要求】建立一个图书信息文件,包括书号(num)、书名(bookname)、作者(name)、出版社(publish)、价格(price)等。
三、实训步骤1、问题分析
正确理解问题,分析问题究竟“做什么”,分析问题已知的信息及其作用,分析在解决中对信息处理的规则、要求、限制条件,分析问题解决后应该输出什么样的结果(输出形式、格式、内容)。
并分析得出判定结果是否正确的标准。
2、设计分析
得出解决问题的思路、主要流程、采用的数据结构类型的说明、主要算法的思想。
3、设计方案
采用的数据结构类型的定义、主要算法的描述及说明。
4、详细设计
根据问题要求和已得到的算法编写程序。
5、调试程序
发现程序中存在的语法错误和一些逻辑错误,并修改,使程序能够运行。
6、运行程序
选择若干具有代表性的输入数据(包括合理数据和不合理数据),进行测试,尽量使程序的各语句和分支都被检查到,以便发现程序中的错误和漏洞,以便改进算法和程序。
7、使用说明
包括程序源代码、算法(程序)流程图、开发过程中各阶段的有关记录、算法的正确性证明、程序的测试结果、对输入输出要求及格式的详细描述。
四、实训内容
(一)个人题目1、二叉树遍历
【问题描述】建立二叉树,实现二叉树的先序遍历、中序、后序和层序遍历(用递归或非递归的方法都可以)。
【要求】编写菜单程序。
能够输入二叉树的各个结点,并能够输出用不同方法遍历的遍历序列;分别建立二叉树存储结构的输入函数、输出先序遍历序列的函数;输出中序遍历序列的函数;输出后序遍历序列的函数;输出层序遍历序列的函数。
【设计分析】1、总体设计(基本概念)树的概念
树(Tree)是n(n>=0)个结点的有限集。
在任意一棵非空树中:
1)有且仅有一个特定的称为根的结点;
2)当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1,T2......Tm,其中每一个集合又是一棵树,并且称为根的子树(SubTree)。
【例】如图1所示:
图1
图1是有8个结点的树,其中A是根,其余结点分成2个互不相交的子集:
T1={B,D},T2={C,E,F,G,H};T1和T2都是根A的子树,且本身也是一棵树。
【设计方案】1.创建二叉树(可从键盘输入各结点的值)2.按某种方式对二叉树进行遍历
3.树型结构是一种非常重要的非线性结构。
树在客观世界是广泛存在的,在计算机领域里也得到了广泛的应用。
在编译程序里,也可用树来表示源程序的语法结构,在数据库系统中,数形结构也是信息的重要组织形式。
4.节点的有限集合(N大于等于0)。
在一棵非空数里:
(1)、有且仅有
一个特定的根节点;
(2)、当N大于1时,其余结点可分为M(M大于0)个互不相交的子集,其中每一个集合又是一棵树,并且称为根的子树。
树的定义是以递归形式给出的。
5.二叉树是另一种树形结构。
它的特点是每个结点最多有两棵子树,并且,二叉树的子树有左右之分,其次序不能颠倒。
从二叉树的递归定义可知,一棵非空的二叉树由根结点及左、右子树这三个基本部分组成。
因此,在任一给定结点上,可以按某种次序执行三个操作:
(1)访问结点本身(N),
(2)遍历该结点的左子树(L),(3)遍历该结点的右子树(R)。
以上三种操作有六种执行次序:
NLR、LNR、LRN、NRL、RNL、RLN。
【详细设计】本程序源代码如下:
/*源程序*/
/*Note:
YourchoiceisCIDE*/#include""#include#include#include#defineMax20typedefcharDataType;#defineMaxStackSize50usingnamespacestd;
typedefstructNode{DataTypedata;
structNode*leftChild;
structNode*rightChild;
}BiTreeNode;
typedefBiTreeNode*DataType2;typedefstruct
{DataType2stack[MaxStackSize];
篇四:
数据结构与数据库实习报告模板
《数据结构与数据库》课程设计报告要求
1、报告正文主要包含以下内容:
①课程设计目的②课程设计所用设备③课程设计心得体会
④课程设计中存在的问题、解决方法及进一步的想法等2、附件报告要求A4纸打印,左侧装订。
3、附件报告内容排版格式要求:
①中文采用小四号字体,西文采用TimesNewRoman字体;②行间距:
固定值18磅,段前段后0行;③每段前开头空两个格(两个汉字大小);
④报告中有截图的,要对截图进行解释说明,并标注图号。
4、报告提交要求:
①报告提交打印版和电子版(电子版,班长按照不同分组收好后,刻一张盘交给到指导老师),字数、格式都要符合要求,不能抄袭别人的报告,一经发现,本周成员的实习成绩为“不及格”;
②本次课程设计所涉及到的数据库以及编写的程序均要求同学自身保管,不用上交,保管期限至少两年,日后有可能会随时调阅。
③报告(电子版、打印版)提交截止日期:
XX年12月31日
注:
以下红色字体标注内容在打印是删除即可。
实习报告
实习名称:
系部名称:
专业班级:
学生姓名:
学号:
指导教师:
黑龙江工程学院教务处制
数据结构与数据库课程设计附件:
XXXXX管理系统的设计与实现
年月日
1引言
篇五:
数据结构实习报告
数据结构实习报告
姓名:
吴加剑班级:
114102学号:
XX1000094学院:
信息工程学院
第一题:
软件压缩/解压缩软件Szip
(Huffman算法及应用)
一.需求规格说明:
问题:
利用哈夫曼编码进行对已经存在的文件进行重新编码,也就是压缩,然后再对该文件进行解码,即解压。
二.总体分析与设计
(1)设计思想:
存储结构主要是采取动态分配内存的方法用数组进行存储,在进行压缩的时候写进文件的表头是自己定义的结构体,我把码长在0-8之间,8-16之间,16-32之间的分别定义了结构体,这三种结构体都具备data(即ASCII码值),码长,不同的是记录哈夫曼编码的指针类型,根据码长的不同指针类型分别为BYTE类型,WORD类型,unsignedint类型。
主要的算法思想是Huffman算法思想和移位,拼接
(2)设计表示:
我设计的是先读出需要压缩的文件,然后利用哈弗曼将其重新
编码从而达到压缩的目的,解压缩则刚好相反。
(3)详细设计表示:
主要算法框架是:
先读一遍文件,统计出每个ASCII码值的频率,并将不
为0的频率当作参数来建立Huffman树,然后获得他们的Huffman编码,码长和ASCII值,把码长在0-8之间的写在一起,8-16之间的写在一起,16-32之间的写在一起,然后写进文件,这就是表头。
然后再读一遍原文件,一个字节一个字节的读,然后将他们拼成32位写进一个新的文件,这就是压缩后的文件。
解码的时候先从压缩的文件中将表头读出来,然后再依次读32位,根据表头信息来进行解码。
三.编码
首先比较困难的是Huffman传参数的下标,我是从0开始的,而书上的函
数代码参数下标是从1开始的,这个问题比较好解决,只要将建Huffman树的函数中有一个地方的数组下标减1就可以了。
第二个问题是有很多ASCII码的频率为0,此时需要将它们从数组中删除,下面的一个问题比较难解决,因为想让表头尽可能的小,所以我想分情况,码长在0-8之间的指针用BYTE类型,码长在8-16之间的指针用WORD类型,码长在16-32之间的码长用unsignedint类型,但是一开始写成了通用的结构体,结果码长的指针用的是void型,结果读出来的时候长度不是因指针的长度不同而改变,所以我就改成了用三个不同的结构体,并且分别记录下每个结构体的个数。
接下来在压缩拼位时一开始用错了,用成了有符号的,结果发现错了,而且还有一个错误是在右移32位是和我预先设想的不同,所以我将其单独列为了一种情况。
接下来就是解码的过程,对我来说,一开始写解码的代码不是很费时间,但是有很多情况没有想全面,结果调程序花了好几天的时间,而且一开始压的时候比原文件都大,始终想不通是为什么,最后才发现是循环的控制条件写错了,我把两个个数弄混了,现在我的程序还有一点点的问题,就是中间解码的时候会有一点乱码,解码时还有一个问题就是最后读最后一次的时候会有不足32位的情况,这时要将多余的位数记下来,否则解码的时候会有多余的字符。
四.程序及算法分析
使用说明:
首先选择数字0或1或2,0代表结束,1代表压缩,2代表解压
缩,然后键入文件的地址,再按回车键就行了。
程序运行结果:
压缩后的文件在一个文本文档中,而还原后的文件在另一个
文件中。
改进思想:
可以用重构Huffman树来解码,这样出错的几率就小了,
还有,有的地方控制循环的条件可以缩小一点。
经验与体会:
通过做题目一使我对Huffman编码的思想有了具体而深刻的体
会,对文件的读写函数更加了解了,也亲自操作了移位与拼接。
对指针的运用更加灵活了。
时间复杂度:
因为我为了拼接和解码的时候方便些,所以在一开始做了些准
备工作,所以循环用的比较多,有的时候是外面一个循环,里面还有一个循环,所以时间复杂度有点高,大部分函数到了n的平方级别。
五.附录
//哈夫曼编码压缩解压缩程序.cpp#include#include#include#include
structhead{
unsignedcharb;//记录字符在数组中的位置longcount;//字符出现频率(权值)longparent,lch,rch;//定义哈夫曼树指针变量
charbits[256];//定义存储哈夫曼编码的数组}
header[512],tmp;
/*压缩*/
voidcompress(){
charfilename[255],outputfile[255],buf[512];unsignedcharc;longi,j,m,n,f;
longmin1,pt1,flengt