《2023年数据结构实习报告(精选多篇).docx》由会员分享,可在线阅读,更多相关《2023年数据结构实习报告(精选多篇).docx(138页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、2023年数据结构实习报告(精选多篇) 推荐第1篇:数据结构实习报告 附件: 实习报告格式,如下: 数据结构实习报告 班级: 姓名: xxx(20231514101) xxx(20231514101) xxx(20231514101) 指导教师: 日期: 题目 一、问题描述(把你所选的题目及要求说一下) 二、概要设计(抽象数据类型定义) 三、详细设计(主要算法和函数间的调用关系) 四、调试分析(调式过程中出现的问题及如何改正) 五、心得体会(组内成员的分工及实习期间的体会) 六、用户手册(系统的使用方法介绍) 可参照习题集上的实习报告格式。 推荐第2篇:数据结构实习报告 一、概述软件开发的流程
2、 二、回顾C语言的基本语法: 1、常量(类型) 2、变量(类型、定义) 3、表达式(例子:三位数的拆分) 4、控制语句(if条件语句,例子:饿了吗?for循环语句,例子:做好事问题求解) 5、数组(例子:猜数字游戏) 三、学生成绩计算系统 做好事问题求解: 某学校为表扬好人好事需核实一件事,老师找了A、B、C、D三个学生,A说:“不是我。”。B说:“是C。”。C说:“是D。”。D说:“C胡说”。这四个人中三个人说了实话。请问:这件好事是谁做的? #include Stdio.h #include Conio.h void main(void) char thisman;/*定义变量用来保存做好
3、事的人*/ int sum=0;/*求和变量*/ /*循环枚举做好事的人*/ for(thisman=A;thisman getch(); 猜数字: 在计算机上设置一个没有重复数字的4位数,不能让猜得人知道。猜的人就可以开始猜。每猜一个数字,出数者就要根据这个数字给出几A几B,其中A前面的数字表示位置正确的数的个数,而B前的数字表示数字正确而位置不对的数的个数。 如正确答案为5234,而猜的人猜5346,则是1A2B,其中有一个5的位置对了,记为1A,而3和4这两个数字对了,而位置没对,因此记为2B,合起来就是1A2B。 接着猜的人再根据出题者的几A几B继续猜,直到猜中为止。 次数限制: 有的
4、时候,这个游戏有猜测次数上的限制。根据计算机测算,这个游戏,如果以最严谨的计算,任何数字可以在7次之内猜出。而有些地方把次数限制为6次或更少,则会导致有些数可能猜不出来。而有些地方考虑到人的逻辑思维难以达到计算机的那么严谨,故设置为8次甚至10次。也有的没有次数上的限制。我们今天要做的这个游戏就是设定次数为8次。 #include Stdio.h #include Conio.h void gue(int b)/*猜数字游戏进行猜数的函数,采用数组作为参数*/ int i=0,j=0,s=0,x=0,k1=0,k2=0;/*i、j、s用于进行循环,x用记录猜 数的次数,k1用于记录位置相同且数
5、相同的数字个数、k2记录数相同的数字个数*/ int a4; while(1) x+; printf(di %d ci shu ru:,x); scanf(%d,&j);/*输入要猜的数放在变量j中*/ for(i=3;i=0;i-)/*将输入的4位数进行拆分放到数组a中*/ ai=j%10; j=j/10; for(i=0;i=0;i-)/*将四位数拆分并按高低位存放在数组b中*/ bi=num%10; num=num/10; printf(ok pre any key); getch();/*等待*/ clrscr();/*清屏*/ int main(void) int b4,num,i,
6、ch=0; while(1)/*条件为1的无限循环作为软件运行的主体,等待退出命令*/ printf(*menu*n); printf(set number input 1n); printf(gue number input 2n); printf(exit input 3n); printf(input your select items:); scanf(%d,&ch); if(ch=1)/*选择变量为1调用设置被猜数字函数*/ set_num(); if(ch=2)/*选择变量为2调用猜数游戏过程函数*/ gue(b); if(ch=3)/*选择变量为3退出循环结束游戏*/ break
7、; getch(); return 0; 推荐第3篇:数据结构实习报告 数据结构实习报告 班级:13软件二班 姓名:殷健 学号:1345536225 子集和数问题 1:问题描述 子集和数问题1:子集和问题的为W,c。其中,W=w1,w2,.,wn是一个正整数的集合,子集和数问题判定是否存在W的一个子集W1,使得W1=cW(0 2:问题分析 程序中设计了函数void computeSumofSub(int s,int k,int r),其意义是从第k项开始,如果s(已经决策的和数)和wk(当前元素)之和为和数,就把结果输出来,否则如果s与,wk,wk+1之和小于和数,则调用computeSumo
8、fsub(s+wk,k+1,r-wk),意为选择此结点的左分支,再判断s和后面所有元素之和是否不小于M(所有的加起来都小,必定无解),并且s+wk+1M,也是无解),若条件符合即调用computeSumofSub(s,k+1,r-wk),即选择当前结点的右分支。 算法展示: #include using namespace std; #include #include #define M 50 cla SumOfSub private: int wM; int m; int xM; public: SumOfSub(int a, int b, int n) for(int i=0;i=m&s+
9、wk+1 ; void main() int sum=0; int wM; srand(unsigned)time(NULL); for(int i=0;i cout cout coutm; sum=m*sum; cout 复杂性分析: 对于不同的输入结果,算法的执行次数有所不同,最好情况是n,最坏情况是n*2n。尽管差异很大,但当n很大时,对某些输入而言,回溯法仍可在短时间内求解。 其它说明: 按书中所讲的约束条件,程序中所有变量都是整型,输入的各元素要从小到大输入,而且不能有重复的元素。若是想要无序输入,可以程序中加入程序1.c的归并排序算法,对输入的数组排序即可。 拓展一 问题描述: 子
10、集和数问题拓展一:子集和问题的为W,c,p。其中,W=w1,w2,.,wn是一个正整数的集合,子集和数问题判定是否存在W的一个子集W1,使得W1=cW(0 问题分析: 增加一个数组p,使得p的每个元素与w对应元素关系为pi=Wi+10;最后结果W子集中元素个数越多,则p和最大,但也可以将每个符合条件子集对应P集合的元素和计算出做个比较,然后输出最大的再对应原W子集。 算法演示 #include using namespace std; #include #include #define M 50 cla SumOfSub private: int wM;int pM;int m; int xM
11、; int NM;int max;int j; public: SumOfSub(int a, int b, int n) max=0;j=0; for(int i=0;i wi=ai; pi=ai+10; m = b; x0=n; void computeSumOfSub(int s, int k, int r) xk = 1; if(s+wk = m) printResult(k); cout else if(s+wk+wk+1 =m&s+wk+1 int S=0;int i; cout for(i=0; i S=S+pi; cout cout cout if(Smax) max=S; i
12、nt J=0; for(i=0;i if(xi=1) NJ=wi; J+; j=J; void special() cout for(int i=0;i cout cout for(int i=0;i wi=rand(); if(wi=0) wi=rand(); sum=sum+wi; cout coutm; sum=m*sum; cout r += wi; sumOfSputeSumOfSub(0, 0, r); sumOfSub.special(); 运行结果 复杂性分析 对于不同的输入结果,算法的执行次数有所不同,最好情况是n,最坏情况是n*2n。尽管差异很大,但当n很大时,对某些输入而
13、言,回溯法仍可在短时间内求解。 拓展二 问题描述 子集和数问题拓展一:子集和问题的为W,c,P。其中,W=w1,w2,.,wn是一个正整数的集合,子集和数问题判定是否存在W的一个子集W1,使得W1=cW(0 问题分析 增加一个数组随机数组P,每个符合条件子集对应P集合的元素和计算出做个比较,然后输出最大的再对应原W子集。 算法演示 #include using namespace std; #include #include #define M 50 cla SumOfSub private: int wM;int pM;int m; int xM;int NM;int max;int j;
14、public: SumOfSub(int a, int b, int n) max=0; j=0; cout for(int i=0;i wi=ai; pi=rand(); cout cout m = b; x0=n; void computeSumOfSub(int s, int k, int r) xk = 1; if(s+wk = m) printResult(k); cout else if(s+wk+wk+1 =m&s+wk+1 int S=0;int i; cout for(i=0; i S=S+pi; cout cout cout if(Smax) max=S; int J=0;
15、 for(i=0;i if(xi=1) NJ=wi; J+; j=J; void special() cout for(int i=0;i cout cout for(int i=0;i wi=rand(); if(wi=0) wi=rand(); sum=sum+wi; cout coutm; sum=m*sum; cout r += wi; sumOfSputeSumOfSub(0, 0, r); sumOfSub.special(); 运行结果 复杂性分析 对于不同的输入结果,算法的执行次数有所不同,最好情况是n,最坏情况是n*2n。尽管差异很大,但当n很大时,对某些输入而言,回溯法仍可
16、在短时间内求解。 推荐第4篇:数据结构实习报告 数据结构第六次作业p134 11411203张玉 24. template void SeqQueue:EnQueue(const T& x)/插入函数 if(IsFull()=true) maxSize=2*maxSize; elementsrear=x; rear=(rear+1)%maxSize; elementsrear=x; rear=(rear+1)%maxSize; ; template bool SeqQueue:DeQueue(const T& x)/删除函数if(IsEmpty()=true) return false; if
17、(rear maxSize=maxSize/2; x=elementsfront; front=(front+1)%maxSize; x=elementsfront; front=(front+1)%maxSize; return true; ; 29. / 利用优先级队列实现栈和队列 #include template cla PQueue;/前视的类定义 template cla Stack; template cla Queue;/优先级队列结点类的定义 template cla PQueueNode friend cla PQueue;/PQueue类作为友元类定义friend cla
18、 Stack; friend cla Queue; public: PQueueNode(T &value, int newpriority, PQueueNode priority(newpriority), link(next) /构造函数 * next):data(value), virtual T GetData() return data; /取得结点数据 virtual int GetPriority() return priority; /取得结点优先级 virtual PQueueNode * GetLink() return link; /取得下一结点地址 virtual v
19、oid SetData(T& value) data = value; /修改结点数据 virtual void SetPriority(int newpriority) priority = newpriority; /修改结点优先级 virtual void SetLink(PQueueNode * next) link = next; /修改指向下一结点的指针 private: T data;/数据 int priority;/优先级 PQueueNode *link;/链指针 ; /优先级队列的类定义 template cla PQueue friend cla Stack; frie
20、nd cla 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; /判队列空否priva
21、te: PQueueNode *front, *rear;/队头指针, 队尾指针 ;template void PQueue:MakeEmpty() /将优先级队列置空 PQueueNode *q; while(front != NULL)/链不空时, 删去链中所有结点 /循链逐个删除 q = front; front = front-link; delete q; rear = NULL;/队尾指针置空 template void PQueue:Insert(T &value, int newpriority) /插入函数 PQueueNode *q = new PQueueNode(val
22、ue, newpriority, NULL);if(IsEmpty() front = rear = q;/队列空时新结点为第一个结点 else PQueueNode *p = front, *pr = NULL;/寻找q的插入位置 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)
23、 rear = q; /删除队头元素并返回 template T PQueue:Remove() if(IsEmpty() return NULL; PQueueNode *q = front; front = front-link; /将队头结点从链中摘下 T &retvalue = q-data; delete q; if(front = NULL) rear = NULL; return retvalue; /读取队头元素的值 template T PQueue:Get() if(IsEmpty() return NULL; else return front-data; /(1) 栈的
24、定义与实现 template cla Stack:public PQueue /栈类定义 public: Stack():PQueue() /构造函数 void Insert(T & value); /插入新元素value到队尾 ;template void Stack:Insert(T & value) /插入函数 PQueueNode *q = new PQueueNode(value, 0, NULL); if(IsEmpty()front = rear = q;/栈空时新结点为第一个结点 else /插入在前端 q-link = front; front = q; / - Queue
25、/(2) 队列的定义与实现 template cla Queue:public PQueue /队列类定义 public: Queue():PQueue() /构造函数 void Insert(T & value);/插入新元素value到队尾 ;template void Queue:Insert(T & value) /插入函数 PQueueNode *q = new PQueueNode(value, 0, NULL); if(IsEmpty() front = rear = q;/队列空时新结点为第一个结点 else rear = rear-link = q;/插入在队尾位置 void
26、 main() Stack aStack;Queue aQueue; int n = 1; aStack.Insert(n);aQueue.Insert(n); 推荐第5篇:数据结构实习报告 一、需求分析 1、程序所实现的功能; 2、程序的输入,包含输入的数据格式和说明; 3、程序的输出,程序输出的形式; 4、测试数据,如果程序输入的数据量比较大,需要给出测试数据; 5、合作人及其分工 二、设计说明 1、主要的数据结构设计说明; 2、程序的主要流程图; 3、程序的主要模块,要求对主要流程图中出现的模块进行说明 4、程序的主要函数及其伪代码说明 (不需要完整的代码) ; 5、合作人设计分工 三、
27、上机结果及体会 1、合作人编码分工 2、实际完成的情况说明(完成的功能,支持的数据类型等); 3、程序的性能分析,包括时空分析; 4、上机过程中出现的问题及其解决方案; 5、程序中可以改进的地方说明; 6、程序中可以扩充的功能及设计实现假想;说明: 1、如果程序比较大,可以将设计说明分为概要设计和详细设计两部分。概要设计主要负责程序的流程、模块、抽象数据类型设计;详细设计负责程序的数据类型定义和主要函数的说明。 2、设计说明中,不需要写出代码或者模块的详细代码,只需要写出主要函数的伪代码说明。 推荐第6篇:数据结构实习报告 数据结构课程设计的实习报告怎么写呀,请求做过课设的同学发一篇范文过来谢
28、谢-_-规范实习报告的开头应给出题目、班级、姓名、学号和完成日期,并包括以下七个内容: 1、需求分析以无歧义的陈述说明程序设计的任务,强调的是程序要做什么?明确规定:(1)输入的形式和输入值的范围;(2)输出的形式;(3)程序所能达到的功能;(4)测试数据:包括正确地输入及其输出结果和含有错误的输入及其输出结果,数据结构实习报告。 2、概要设计说明本程序中用到的所有抽象数据类型的定义、主程序的流程以及各程序模块之间的层次(调用)关系。 3、详细设计实现概要设计中定义的所有数据类型,对每个操作只需要写出伪码算法;对主程序和其他模块也都需要写出伪码算法(伪码算法达到的详细程度建议为:按照伪码算法可
29、以在计算机键盘直接输入高级程序设计语言程序);画出函数的调用关系图。 4、调试分析内容包括:(1)调试过程中遇到的问题是如何解决的以及对设计与实现的回顾讨论和分析;(2)算法的时空分析(包括基本操作和其他算法的时间复杂度和空间复杂度的分析)和改进思想;(3)经验和体会等,实习报告数据结构实习报告。 5、用户使用说明说明如何使用你编写的程序,详细列出每一步操作步骤。 6、测试结果列出你的测试结果,包括输入和输出。这里的测试数据应该完整和严格,最好多于需求分析中所列。 7、附录题目:约瑟夫-实习报告尺寸:约瑟夫-实习报告.doc目录: 一、需求分析 二、概要设计 三、程序具体设计及函数调用关系 四
30、、调试分析 五、测试结果原文:实习报告题目:约瑟夫(Joseph)问题的一种描述是:编号为1,2,.,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个开始重新从1报数,如此下去,直至年有人全部出列为止。试设计一个程序求出出列顺序。班级:姓名:学号:完成日期: 一、需求分析1.本演示程序中,利用单向循环链表存储结构存储约瑟夫环数据(即n个人的编号和密码)。2.演示程序以用户和计算机的对话方式执行,即在计算机终端上显示提示信息
31、之后,由用户在键盘上输入演示程序中需要输入的数据,运算结果显示在其后。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,n0数据关系:R1=ai-1,ai|,ai-1,aiD,I=1,2,.,n基本操作:Init List(&L)操作结果:构造一个空的线性表L。List Insert(&L,i,e)初始条件:线性表L已存在,1iL
32、ist Length(L)+1.操作结果:在L中第i个位置之前插入新的数据无素e,L长度加1。List Delete(&L,i,&e)初始条件:线性表L存在非空,1iList Length(L).操作结果:删除L的第i个元素,并用e返回其值,L长度减1。2.程序包含四个模块:1)主程序模块:void main(). 推荐第7篇:数据结构 实验:线性表的基本操作 【实验目的】 学习掌握线性表的顺序存储结构、链式存储结构的设计与操作。对顺序表建立、插入、删除的基本操作,对单链表建立、插入、删除的基本操作算法。 【实验内容】 1.顺序表的实践 1) 建立4个元素的顺序表s=sqlist=1,2,3,
33、4,5,实现顺序表建立的基本操作。 2) 在sqlist =1,2,3,4,5的元素4和5之间插入一个元素9,实现顺序表插入的基本操作。 3) 在sqlist =1,2,3,4,9,5中删除指定位置(i=5)上的元素9,实现顺序表的删除的基本操作。 2.单链表的实践 3.1) 建立一个包括头结点和4个结点的(5,4,2,1)的单链表,实现单链表建立的基本操作。 2) 将该单链表的所有元素显示出来。 3) 在已建好的单链表中的指定位置(i=3)插入一个结点3,实现单链表插入的基本操作。 4) 在一个包括头结点和5个结点的(5,4,3,2,1)的单链表的指定位置(如i=2)删除一个结点,实现单链表
34、删除的基本操作。 5) 实现单链表的求表长操作。 【实验步骤】 1.打开VC+。 2.建立工程:点File-New,选Project标签,在列表中选Win32 Console Application,再在右边的框里为工程起好名字,选好路径,点OK-finish。至此工程建立完毕。 3.创建源文件或头文件:点File-New,选File标签,在列表里选C+ Source File。给文件起好名字,选好路径,点OK。至此一个源文件就被添加到了你刚创建的工程之中。 4写好代码 5编译链接调试 【实验心得】 线性是我们学习数据结构中,碰到的第一个数据结构。学习线性表的重点掌握顺序表和单链表的各种算法和
35、时间性能分析。线性表右两种存储方式即顺序存储结构和链式存储结构。通过学习我知道了对线性表进行建立、插入、删除,同时单链表也是进行建立、插入、删除。而对于顺序表的插入删除运算,其平均时间复杂度均为0(n).通过这次的学习,掌握的太熟练,主要是课本上的知识点没有彻底的理解,回去我会多看书,理解重要的概念。总之,这次实验我找到了自己的不足之处,以后会努力的。 实验二:栈的表示与实现及栈的应用 【实验目的】 (1) 掌握栈的顺序存储结构及其基本操作的实现。 (2) 掌握栈后进先出的特点,并利用其特性在解决实际问题中的应用。 (3) 掌握用递归算法来解决一些问题。 【实验内容】 1.编写程序,对于输入的
36、任意一个非负十进制整数,输出与其等值的八进制数。 2.编写递归程序,实现N!的求解。3.编写递归程序,实现以下函数的求解。 n,n=0,1Fib(n)= Fib(n-1)+Fib(n-2),n1 4.编写程序,实现Hanoi塔问题。【实验步骤】 1.打开VC+。 2.建立工程:点File-New,选Project标签,在列表中选Win32 Console Application,再在右边的框里为工程起好名字,选好路径,点OK-finish。至此工程建立完毕。 3.创建源文件或头文件:点File-New,选File标签,在列表里选C+ Source File。给文件起好名字,选好路径,点OK。至
37、此一个源文件就被添加到了你刚创建的工程之中。 4写好代码 5编译链接调试 【实验心得】 通过这次的学习我掌握了栈这种抽象数据类型的特点,并能在相应的应用任务中正确选用它;总的来说,栈是操作受限的线性表,是限定仅在表尾进行插入或删除操作的线性表。因此,对栈来说,表尾端有其特殊含义,称为栈顶(top),相应地,表头端称为栈底(botton);栈又称为后进先出(Last In First Out)的线性表,简称LIFO结构,因为它的修改是按后进先出的原则进行的。 加上这个实验,我已经学了线性表(顺序表,单链表)和栈,知道它们都是线性表,而且对以后的学习有很大的作用,可以说这是学习以后知识的总要基础。
38、 实验三:二叉树的建立及遍历 【实验目的】 (1) 掌握利用先序序列建立二叉树的二叉链表的过程。 (2) 掌握二叉树的先序、中序和后序遍历算法。 【实验内容】 1.编写程序,实现二叉树的建立,并实现先序、中序和后序遍历。如:输入先序序列abc#de#,则建立如下图所示的二叉树。 并显示其先序序列为:abcde 中序序列为:cbaed 后序序列为:cbeda 【实验步骤】 1.打开VC+。 2.建立工程:点File-New,选Project标签,在列表中选Win32 Console Application,再在右边的框里为工程起好名字,选好路径,点OK-finish。至此工程建立完毕。 3.创建
39、源文件或头文件:点File-New,选File标签,在列表里选C+ Source File。给文件起好名字,选好路径,点OK。至此一个源文件就被添加到了你刚创建的工程之中。 4写好代码 5编译链接调试 【实验心得】 这次试验是关于二叉树的常见操作,主要是二叉树的建立和遍历,在这次实验中我按先序方式建立二叉树的,而遍历方式则相对要多一些,有递归的先序、中序、后序遍历,和非递归的先序、中序、后序遍历,此外还有层次遍历.二叉树高度和叶子个数的计算和遍历相差不大,只是加些判断条件,总体来说,本次试验不太好做,期间出现了很多逻辑错误,变量初始化的问题等,不过经过仔细排查最后都一一解决了。 实验四:查找与排序 【实验目的】 (1) 掌握折半查找算法的实现。 (2) 掌握冒泡排序算法的实现。 【实验内容】 1.编写折半查找程序,对以下数据查找37所在的位置。5,13,19,21,37,56,64,75,80,88,92 2.编写冒泡排序程序,对以下数据进行排序。 49,38,65,97,76,13,27,49 【实验步骤】 1.打开VC+。 2.建立工程:点File-New,选Project标签,在列表中选Win32 Console Application,再在右边的框里为工程起好名字,选好路径,点OK-finish。