数据结构实验指导书(2015级)
- 格式:doc
- 大小:235.50 KB
- 文档页数:29
《数据结构》实验指导书实验一、顺序表实验目的:熟悉顺序表的逻辑特性、存储表示方法和顺序表的基本操作。
实验要求:了解并熟悉顺序表的逻辑特性、存储表示方法和顺序表的基本操作的实现和应用。
实验内容:编写程序实现下列的要求:(1) 设数据元素为整数,实现这样的线性表的顺序存储表示。
(2) 键盘输入10个数据元素,利用顺序表的基本操作,建立该表。
(3) 利用顺序表的基本操作,找出表中的最大的和最小的数据元素(用于比较的数据元素为整数)。
(4) * 若数据元素为学生成绩(含姓名、成绩等字段),重新编程,实现上面的要求。
要求尽可能少地修改前面的程序来得到新程序。
(这里用于比较的字段为分数)练习及思考题:(1)顺序表的操作上有什么特点?(2)不固定数据元素的个数,而通过特殊数据来标记输入数据的结束,实现这样的输入操作。
实验二、链表实验目的:熟悉链式表的逻辑特性、存储表示方法的特点和链式表的基本操作。
实验要求:了解并熟悉链式表的逻辑特性、存储表示方法和链式表的基本操作的实现和应用。
实验内容:编写程序实现下列的要求:(1) 设学生成绩表中的数据元素为学生成绩(含姓名、成绩字段),实现这样的线性表的链式存储表示。
(2) 键盘输入若干个数据元素(用特殊数据来标记输入数据的结束),利用链表的基本操作(前插或后插算法),建立学生成绩单链表。
(3) 键盘输入关键字值x,打印出表中所有关键字值<=x的结点数据。
(用于比较的关键字字段为分数)。
(4) 输入关键字值x,删除表中所有关键字值<=x的结点。
(用于比较的关键字字段为分数)。
练习及思考题:(1)不同类型的数据元素所对应的链式表在类型定义和操作实现上有什么异同?(2)有头结点的链式表,有什么特点?实验三、栈的应用实验目的:熟悉栈的逻辑特性、存储表示方法和栈的基本操作。
实验要求:了解并熟悉栈的逻辑特性、顺序和链式存储表示方法和栈的基本操作的实现和应用。
实验内容:(1) 判断一个表达式中的括号(仅有一种括号,小、中或大括号)是否配对。
《数据结构实验》指导书Data Structures and Algorithms Laboratory Projects王金荣2014-09-11目录1《数据结构实验》课程实验教学大纲--------------------------------------12 实验准备: 如何使用VC 6.0? ----------------------------------------------33 Projects---------------------------------------------------------------------------8 3.1 Project 1: 算法性能测量-------------------------------------------------8 3.2 Project 2: 有序表归并实验---------------------------------------------10 3.3 Project 3: 数据转换------------------------------------------------------11 3.4 Project 4: 二叉树遍历实验---------------------------------------------12 3.5 Project 5-1: 堆排序算法实现------------------------------------------13 3.6 Project 5-2: 归并排序算法实现---------------------------------------14 3.7 Project 5-3: 快速排序算法实现---------------------------------------15 3.8 Project 6-1: 图的深度优先搜索---------------------------------------16 3.9 Project 6-2: 图的广度优先搜索---------------------------------------173.10 Project 7: 散列实验---------------------------------------------------184.1 ACM题目-------------------------------------------------------------------19 4.1 ACM 1: ACboy needs your help again!-------------------------------19 4.2 ACM 2: Jumping the Queue--------------------------------------------21 4.3 ACM 3: Median ----------------------------------------------------------234.4 ACM 4: Ignatius and the Princess I------------------------------------255 实验报告格式-----------------------------------------------------------------28 6实验报告上交说明-----------------------------------------------------------291《数据结构实验》课程实验教学大纲课程中文名称:数据结构实验课程英文名称:Data Structure Practices实验课程性质:独立设课课程编码:044209101一、学时、学分课程总学时:34 实验学时:34课程总学分:1 实验学分:1二、适用专业及年级计算机科学与技术专业,软件工程专业,第二学期三、实验教学目的与基本要求“数据结构实验”的总体目标是:通过实验使学生对课堂讲授的内容有实际的体验,加深对概念、算法、技术的理解、掌握、应用,并激发学生进一步的思考和发挥,注重培养学生的学习兴趣和创新思维。
数据结构实验指导书一、实验目的数据结构是计算机科学中的重要基础课程,通过实验,旨在帮助学生更好地理解和掌握数据结构的基本概念、原理和算法,提高学生的编程能力和问题解决能力。
具体而言,实验的目的包括:1、加深对常见数据结构(如数组、链表、栈、队列、树、图等)的理解,掌握其特点和操作方法。
2、培养学生运用数据结构解决实际问题的能力,提高算法设计和程序实现的能力。
3、增强学生的逻辑思维能力和调试程序的能力,培养学生的创新意识和团队合作精神。
二、实验环境1、操作系统:Windows 或 Linux 操作系统。
2、编程语言:C、C++、Java 等编程语言中的一种。
3、开发工具:如 Visual Studio、Eclipse、Code::Blocks 等集成开发环境(IDE)。
三、实验要求1、实验前,学生应认真预习实验内容,熟悉相关的数据结构和算法,编写好实验程序的代码框架。
2、实验过程中,学生应独立思考,认真调试程序,及时记录实验过程中出现的问题及解决方法。
3、实验完成后,学生应撰写实验报告,包括实验目的、实验内容、实验步骤、实验结果、问题分析与解决等。
四、实验内容(一)线性表1、顺序表的实现与操作实现顺序表的创建、插入、删除、查找等基本操作。
分析顺序表在不同操作下的时间复杂度。
2、链表的实现与操作实现单链表、双向链表的创建、插入、删除、查找等基本操作。
比较单链表和双向链表在操作上的优缺点。
(二)栈和队列1、栈的实现与应用实现顺序栈和链式栈。
利用栈解决表达式求值、括号匹配等问题。
2、队列的实现与应用实现顺序队列和链式队列。
利用队列解决排队问题、广度优先搜索等问题。
(三)树1、二叉树的实现与遍历实现二叉树的创建、插入、删除操作。
实现二叉树的前序、中序、后序遍历算法,并分析其时间复杂度。
2、二叉搜索树的实现与操作实现二叉搜索树的创建、插入、删除、查找操作。
分析二叉搜索树的性能。
(四)图1、图的存储结构实现邻接矩阵和邻接表两种图的存储结构。
《数据结构》实验指导书第一部分前言一、实验的目的《数据结构》是计算机学科一门重要的专业基础课程,也是计算机学科的一门核心课程。
本课程的另一重要教学目的是训练学生进行复杂程序设计的技能和培养良好程序设计的习惯,要做到这一点,上机实习是必须的。
数据结构实验是对学生的一种全面综合训练,是与课堂听讲、自学和练习相辅相成的必不可少的一个教学环节。
通常,实验课题中的问题比平时的习题复杂得多,也更接近实际。
实验着眼于原理与应用的结合点,使学生学会如何把书上学到的知识用于解决实际问题,训练学生实际动手进行程序设计和调试程序的能力,加深对数据结构相关概念和算法的理解。
通过完成本实验课程的实验,学生应学会并掌握本课程的基本和重点知识,深刻理解逻辑结构、物理结构和算法设计之间的关系,初步学会算法分析的方法,并能在一定范围内运用所掌握的分析方法进行算法分析,培养软件工作所需要的动手能力和作为一个软件工作者所应具备的科学工作方法和作风。
二、实验前的准备工作1.每个学生需配备一台计算机,操作系统需Windows2000/XP以上版本,软件需Visual C++6.0以上版本。
2.实验前要求学生按实验要求编写好相关实验程序,准备上机调试运行。
三、实验的步骤(一)建立一个文件夹,如“数据结构”,用来存放自己的所有实验程序,在该文件夹中建立子目录用来存放每个项目(一个子目录一个项目),如“顺序表”,项目中需要的所有文件都存在该文件夹中。
(二)新建一个项目文件1.双击Visual C++ 6.0快捷图标,进入Visual C++ 6.0集成开发环境;或者点击“开始”→“程序”→“Microsoft Visual Studio 6.0”→“Microsoft Visual C++ 6.0”进入Visual C++ 6.0集成开发环境。
2.单击“File”菜单,选择“New”命令3.创建一个项目文件并保存在项目所在文件夹中;3. 创建源程序文件并保存在项目所在文件夹中;4.输入源程序;5.单击“保存”按钮保存源程序。
数据结构实验指导书院别专业班级姓名计算机学院编实验一线性表的顺序存储实验一、实验目的及要求1、掌握在TC环境下调试顺序表的基本方法2、掌握顺序表的基本操作,插入、删除、查找、以及有序顺序表的合并等算法的实现。
二、实验学时2学时三、实验任务1、生成一个顺序表并动态地删除任意元素和在任意位置插入元素。
2、将两个有序表合并成一个有序表。
四、实验重点、难点1、在顺序表中移动元素。
2、在顺序表中找到正确的插入位置。
五、操作要点(一)顺序表基本操作的实现[问题描述] 当我们要在顺序表的第i个位置上插入一个元素时,必须先将顺序表中第i个元素之后的所有元素依次后移一个位置,以便腾空一个位置,再把新元素插入到该位置。
若是欲删除第i个元素时,也必须把第i个元素之后的所有元素前移一个位置。
[基本要求] 要求生成顺序表时,可以键盘上读取元素,用顺序存储结构实现存储。
[实现提示] 要实现基本操作,可用实现的基本操作,也可设计简单的算法实现。
[程序实现]#include <stdio.h>#include <conio.h>typedef int DataType ;# define maxnum 20typedef struct{int data[maxnum];int length;}SeqList;/*插入函数*/int insert(SeqList *L , int i , DataType x)/* 将新结点x插入到顺序表L第i个位置 */{ int j ;if( i<0 || i>(*L).length +1){ printf(" \n i 值不合法 ! ");return 0;}if((* L).length >=maxnum-1){ printf(" \n 表满不能插入!");return 0;}for(j=(*L).length;j>=i;j--) (*L).data[j+1]=(*L).data[j];(*L).data[i] = x;(*L).length++;return 1;}/*删除函数*/int delete( SeqList *L ,int i)/*从顺序L中删除第i个结点*/{ int j ;if( i<0|| i>(*L).length ){ printf(" \n 删除位置错误 ! ") ;return 0;}for(j=i+1;j<=(*L).length;j++)(*L).data[j-1] =(*L).data[j];(*L).length--;return 1;}/*生成顺序表*/void creatlist(SeqList * L){ int n , i , j ;printf("请输入顺序表 L 的数据个数:\n") ;scanf("%d" , &n) ;for(i=0 ; i<n ; i++){ printf("data[%d] =" , i) ;scanf("%d",&((*L).data[i]));}(*L).length=n-1;printf("\n") ;}/*creatlist *//*输出顺序表 L*/printout(SeqList * L){ int i ;for (i=0 ; i<=(* L).length ; i++){ printf(" data[%d]=", i) ;printf("%d", (*L).data[i]);}/*printout */printf("\n");}main(){ SeqList *L ;char cmd ;int i , t , x;clrscr() ;creatlist(L);do{printf("\ni , I ----- 插入\n") ;printf("d , D ----- 删除\n") ;printf("q , Q ----- 退出\n") ;do{cmd=getchar() ;}while((cmd!='i')&&(cmd!='I')&&(cmd!='d')&&(cmd!='D')&&(cmd!='q')&&(cmd!='Q')); switch(cmd){ case 'i':case 'I':printf("\nPlease input the DATA: ");scanf("%d",&x) ;printf("\nWhere? ");scanf("%d",&i) ;insert(L,i,x) ;printout(L);break ;case 'd':case 'D' :printf("\nWhere to Delete? ");scanf("%d",&i);delete(L,i);printout(L);break ;}}while((cmd!='q')&&(cmd!='Q'));}(二)有序顺序表的合并[问题描述] 已知顺序表la和lb中的数据元素按非递减有序排列,将la和lb表中的数据元素,合并成为一个新的顺序表lc[基本要求] lc中的数据元素仍按非递减有序排列,并且不破坏la和lb表[程序实现]# include <stdio.h># define maxnum 20typedef int DataType ;typedef struct{ DataType data[maxnum] ;int length ;}SeqList ;int MergeQL(SeqList la , SeqList lb , SeqList *lc){ int i , j , k ;if (la.length+1 + lb.length+1>maxnum){ printf("\narray overflow!") ;return 0;}i=j=k=0;while(i<=la.length && j<=lb.length){ if (la.data[i]<=lb.data[j])lc->data[k++]=la.data[i++] ;elselc->data[k++]=lb.data[j++];}/* 处理剩余部分 */while (i<=la.length) lc->data[k++]=la.data[i++];while (j<=lb.length) lc->data[k++]=lb.data[j++];lc->length=k-1;return 1;}main(){ SeqList la={{3,4,7,12,15},4} ;SeqList lb={{2,5,7,15,18,19},5} ;SeqList lc ;int i ;if (MergeQL(la,lb,&lc)){ printf("\n") ;for(i=0;i<=lc.length ; i++)printf("%4d",lc.data[i]);}}六、注意事项1、删除元素或插入元素表的长度要变化。
《数据结构课程设计》指导书•实验目的意义数据结构实验是《数据结构》课程必不可少的一个教学环节。
通过实验,学生不仅能够深化理解教学内容,进一步提高灵活运用数据结构和算法的能力,而且可以在问题分析、总体结构设计、算法设计、程序设计、上机操作及程序调试等基本技能方面受到综合训练。
实验着眼于原理与应用的结合点,使学生学会如何把书本上和课堂上学到的知识用于解决实际问题,从而培养软件工作所需要的动手能力。
•实验基本步骤及要求1.阅读实验指导书每一次实验从阅读实验指导书开始。
对于本次实验的实验目的、实验题目、实现提示以及思考题目、选做题目等应认真了解。
2.算法设计分析实验题目,参考实现提示,进行算法设计。
3.程序设计根据已完成的算法,用C语言或java进行程序设计。
4.调试和测试将所编程序在计算机上调试通过,并选取若干组测试数据对程序进行尽可能全面的测试。
5.整理完成实验报告实验报告一般包括下列内容:(1)实验者姓名、学号、专业和班级,课程名称(数据结构实验),实验日期等;(2)本次实验的实验编号及实验名称(例如:实验一线性表的应用);(3)本次实验的实验目的(可参考《数据结构实验指导》相关内容);(4)本次实验的实验地点、设备编号、硬件及软件环境;(5)程序结构的描述及各模块的规格说明;(6)主要算法及其基本思想;(7)调试过程简述(调试过程是否顺利,遇到些什么问题,如何解决的,以及上机操作所花费的时间等);(8)测试数据和相应输出的客观纪录,对运行结果的分析讨论。
•注意:为了有效地利用上机时间,上述实验步骤1,2,3应在上机之前完成。
1目录实验一顺序表及其在简单排序中的应用实验二线性表的链式存储实验三各种排序算法的比较实验四栈及其应用实验五栈和队列的综合应用实验六二叉树及其应用实验七图论及其应用实验八(1) 表达式求值实验八(2) 停车场管理模拟实验八(3) 哈希表设计(《数据结构题集6.2》)2实验一顺序表及其在简单排序中的应用一.实验目的熟悉线性表的顺序存储结构,熟练掌握顺序表的抽象数据类型及各种基本操作的实现;利用所定义的顺序表抽象数据类型实现各类排序算法,培养灵活运用顺序表解决实际问题的能力。
数据结构实验指导书吉林大学珠海学院计算机系2012.12实验目的与要求《数据结构》是计算机学科重要的专业基础课,北京市高校已将该课作为理工科非计算机专业的提高课程,北京大学将此课列为理工科非计算机专业必修课已经超过15 年。
该课程主要研究信息在计算机中的组织和表示方法。
上机实验是本课程教学至关重要的环节,通过上机实验,使学生在数据结构的逻辑结构定义、存储表示、操作的实现、数据结构的选择和应用、算法实践等方面加深对课程内容的理解,训练学生进行复杂程序设计的技能和培养良好程序设计的习惯。
考虑到大一上学期学习过C程序设计,本学期有C课程设计和C++程序设计,故数据结构课程的实验不安排验证性实验,按课程设计要求。
具体说是期初布置题目,按学号顺序确定如下题目,学生自己准备,期中检查,15周开始验收。
验收时间安排在周末。
实验内容从以下题目中选一题题目一、航空客运订票系统题目二、文章编辑题目三、宿舍管理查询软件题目四、校园导航系统题目五、散列法的实验研究题目六、小型图书馆管理系统(链表的插入,排序,查询,删除)题目七、学生搭配问题题目八、敢死队问题题目九、教学计划编制问题题目十、活期储蓄帐目管理题目十一、通讯录的制作题目十二、二叉排序树的实现题目十三、利用栈求表达式的值题目十四、走迷宫游戏题目十五、顺序结构、动态链表结构下的一元多项式的加法、减法、乘法的实现题目十六、线索二叉树的应用题目十七、稀疏矩阵实现与应用题目十八、树的应用题目十九、图的遍历和生成树求解实现题目二十、排序综合题目二十一、纸牌游戏题目二十二、利用栈求表达式的值,可供小学生作业,并能给出分数题目二十三、数制转换问题题目二十四、停车场问题题目二十五、学生成绩管理系统题目二十六、哈夫曼编码/译码器题目二十七、特殊矩阵的压缩存储算法的实现题目二十八、产品进销存管理系统题目二十九、客户消费积分管理系统题目三十、约瑟夫环题目三十一、任意长的整数加法题目三十二、广义表的应用题目三十三、关键路径问题题目三十四、构造可以使n个城市连接的最小生成树题目三十五、神秘国度的爱情故事题目三十六、利用Hash技术统计C源程序中关键字的频度题目一、航空客运订票系统通过此系统可以实现如下功能:录入:可以录入航班情况(数据可以存储在一个数据文件中,数据结构、具体数据自定);查询:可以查询某个航线的情况(如,输入航班号,查询起降时间,起飞抵达城市,航班票价,票价折扣,确定航班是否满仓);可以输入起飞抵达城市,查询飞机航班情况;订票:(订票情况可以存在一个数据文件中,结构自己设定)可以订票,如果该航班已经无票,可以提供相关可选择航班;退票:可退票,退票后修改相关数据文件;客户资料有姓名,证件号,订票数量及航班情况,订单要有编号。
引言概述正文内容
1.实验环境配置
1.1硬件要求
计算机硬件配置要求
操作系统要求
附加硬件设备要求(如虚拟机等)
1.2软件要求
编程语言要求(如C/C++、Java等)开发环境配置(如IDE、编译器等)1.3实验库和工具
实验需要使用的库文件和工具
如何获取和配置实验库和工具
2.实验内容介绍
2.1实验目标和背景
数据结构实验的作用和意义
实验背景和相关应用领域介绍
2.2实验概述
实验内容的大致流程和步骤
实验中可能遇到的问题和挑战
2.3实验要求
对学生实验流程和实验结果的要求
实验过程中需要注意的事项和技巧
3.实验步骤
3.1实验准备
配置实验环境
获取实验所需数据和文件
3.2实验具体步骤
根据实验要求将数据结构知识应用到具体问题中根据实验要求实现相应的算法和数据结构
3.3实验示例代码
提供示例代码以供学生参考和学习
解析示例代码中的关键步骤和实现细节
4.实验答案
4.1实验题目
实验题目及相关说明
确定实验的具体要求和目标
4.2实验答案解析
对实验答案的具体实现进行解析
对实验中可能遇到的问题和错误进行分析和解决4.3实验答案示例
提供实验答案的示例代码
解析实验答案中的关键实现步骤和说明
5.实验总结
5.1实验成果评估
对学生实验成果进行评估
分析实验结果的优点和不足
5.2实验心得
学生对本次实验的收获和感想
学生对未来实验的建议和展望
总结。
数据结构实验指导书数据结构实验指导书目录数据结构实验指导书 (1)目录 (1)实验指导书概述 (2)实验题目 (3)实验一单链表的插入、删除 (3)[实验目的] (3)[实验内容] (3)[测试数据] (3)[实现提示] (3)实验二栈及其应用 (5)[实验目的] (5)[实验内容] (5)[测试数据] (5)实验三二叉树的递归算法 (5)[实验目的] (5)[实验内容] (6)[测试数据] (6)实验四查找及排序算法的应用 (7)[实验目的] (7)[实验内容] (7)[测试数据] (7)实验指导书概述“数据结构”是计算机专业一门重要的专业技术基础课程,是一门关键性核心课程。
本课程系统地介绍了软件设计中常用的数据结构以及相应的存储结构和实现算法,介绍了多种常用的查找和排序技术,并对其进行了性能分析和比较,内容非常丰富。
本课程的学习将为后续课程的学习以及软件设计水平的提高打下良好的基础。
由于以下原因,使得掌握这门课程具有较大难度:∙内容多,时间短,给学习带来困难;∙贯穿全书的动态链表存储结构和递归技术是学习中的重点和难点;∙隐含在各部分的技术和方法丰富,也是学习的重点和难点;∙先修课程中所介绍的专业性知识不多,加大了学习难度。
由于数据结构课程的技术性与实践性,《数据结构课程实验》的设置十分必要。
为了帮助学生更好地学习本课程,理解和掌握算法设计所需的技术,为整个专业学习打好基础,要求运用所学知识,上机解决一些典型问题,通过分析、设计、编码、调试等各环节的训练,使学生深刻理解、牢固掌握所用到的一些技术。
数据结构中稍微复杂一些的算法设计中可能同时要用到多种技术和方法,如算法设计的构思方法,动态链表,算法的编码,递归技术,与特定问题相关的技术等,要求重点掌握线性链表、二叉树和树、图结构、数组结构相关算法的设计。
在掌握基本算法的基础上,掌握分析、解决实际问题的能力。
通过实验实践内容的训练,突出构造性思维训练的特征, 提高学生组织数据及编写大型程序的能力。
数据结构实验指导书实验顺序表的基本操作一、实验目的.掌握使用上机调试线性表的基本方法;.掌握线性表的基本操作:插入、删除、查找等运算在顺序存储结构上的实现。
二、实验内容顺序表的基本操作的实现三、实验要求.仔细阅读和理解本实验的程序。
.上机运行本程序。
(源程序)四、写出该程序的功能和运行结果。
五、实验总结(在实验中遇到了哪些问题,如何解决的)六、实验评价(教师)实验线性表在链式存储结构下的基本操作一、实验目的.掌握使用上机调试线性表的基本方法;.掌握线性表的基本操作:插入、删除、查找等运算在链式存储结构上的实现。
二、实验内容线性表在链式存储结构下的基本操作三、实验要求.仔细阅读和理解实验中给出的程序。
并据此写出线性表的各种基本操作在链式存储结构上的程序。
.上机运行写出的程序,并且独立调试通过。
(源程序)四、写出该程序的功能和运行结果。
五、实验总结(在实验中遇到了哪些问题,如何解决的)六、实验评价(教师)实验栈的基本操作一、实验目的.掌握使用上机调试栈的基本方法;. 深入了解栈的特性,掌握栈的各种基本操作。
二、实验内容栈在顺序存储结构下的各种基本操作三、实验要求.仔细阅读和掌握本实验的算法。
.上机将本算法实现。
并据此写出栈的各种基本操作在顺序存储结构上的程序。
.上机运行写出的程序,并且独立调试通过。
(源程序)四、写出该程序的功能和运行结果。
五、实验总结(在实验中遇到了哪些问题,如何解决的)六、实验评价(教师)实验队列的基本操作一、实验目的. 深入了解队列的特性,掌握队列的各种基本操作。
二、实验内容队列在链式存储结构下的基本操作三、实验要求.仔细阅读和掌握本实验的算法。
.上机将本算法实现。
并据此写出队列的各种基本操作在链式存储结构上的程序。
.上机运行写出的程序,并且独立调试通过。
(源程序)四、写出该程序的功能和运行结果。
五、实验总结(在实验中遇到了哪些问题,如何解决的)六、实验评价(教师)实验串及其应用一、实验目的:本次实验的目的是熟悉串类型的实现方法和文本模式匹配方法。
《数据结构》实验指导书高级语言与数据结构课程组绍兴文理学院教务处2015年2月版目录数据结构实验步骤、规范的要求与建议---------------------------------- 2 数据结构实验时间安排--------------------------------------------------- 3 数据结构实验报告示例--------------------------------------------------- 4 实验一、大整数加法------------------------------------------------------ 10 实验二、栈序列匹配----------------------------------------------------- 14 实验三、二叉排序树----------------------------------------------------- 17 实验四、最小生成树----------------------------------------------------- 21 附录:VC有关操作的提示----------------------------------------------- 27数据结构实验步骤、规范的要求与建议从以往教学实验的经验来看,在初学阶段严格按实验步骤的要求去做,有助于养成良好的程序编制风格,培养严谨、科学、高效的工作方式。
经常发现很多学生抱怨说,化了两个小时才找出一个错误,甚至一无所获。
他们不明白造成这种情况的原因,正是他们自己。
有的学生不屑于按实验步骤去做,甚至对于实验步骤的要求看都不看一遍,认为那是浪费时间,这是极其有害的。
有的学生甚至主要是抄袭别人的,以应付检查,这是学习上的堕落,是很危险的!实验题目配合课程的进度,请同学们务必自己独立完成。
为了锻炼自己的应用各种不同的数据结构的能力,尽可能的多做一些题目是非常必要的。
在完成各种不同题目的过程中,加深对数据结构的理解和把握,提高编程和实践能力,从而帮助你在更高的角度解决各种应用问题。
按实验步骤进行实验,不但可以培养科学化的工作作风,而且还能有效地避免错误,提高实验效率,达到实验目的。
具体的要求如下:1、问题分析与系统的结构设计:充分地分析和理解问题本身,弄清要求作什么,限制条件是什么。
按照以数据结构和功能模块为中心的原则划分模块,即定义数据结构及其在这些结构之上的操作,使得对数据结构的存取通过这些操作加以实现。
在这个过程中,要考虑系统结构清晰、合理、简单并且易于调试。
最后写出每个子程序(过程或函数)的规格说明,列出它们之间的调用关系,可以使用调用关系图表示则更加清晰,这样便完成了系统结构设计。
2、详细设计和编码详细设计的目的是对子程序(过程或函数)的进一步求精。
可以用IF、WHILE等伪代码等自然语言写出算法的框架,以避免陷入细节。
在编码时,可以对详细设计的结果进一步求精,用高级语言表示出来。
也可以直接用高级语言来描述算法。
程序的每一行最好不超过60个字符。
每个子程序(或过程、函数)通常不要太长,以不超过40行为宜。
子程序(或过程、函数)包含的程序行数太多,易于造成理解的困难。
控制循环和判断等语句的连续嵌套的深度。
程序的目的性必须明确。
对每一段程序完成的作用,除非常明显的除外,尽可能加以注释。
这会对程序的调试提供很多方便。
另外,根据情况可以设立若干调试点,即输出若干信息,用于验证和你的设想是否一致。
3、上机调试程序自底向上,先调试底层模块,再调试上层模块。
最后,整个程序进行联调。
调试正确后将源程序和运行结果加以输出。
4、实验报告的书写(1) 需求分析问题描述,求解的问题是什么。
包括实验的任务、输入、输出、功能、测试数据等。
(2) 概要设计设计思想:存储结构、主要的算法思想。
设计表示:主程序、子程序(过程或函数)的规格说明,通过调用关系图表示它们之间的调用关系。
(3) 详细设计数据类型。
主程序和其他模块的算法或算法框架。
(4) 调试分析问题是如何解决的,讨论与分析、改进设想、经验与体会、时空复杂度等。
至少写三点。
(5) 测试结果列出你的测试结果,包括输入的测试数据和输出的结果。
测试数据应该完整和严格,必要时用多组数据进行测试。
(6) 用户手册:使用说明。
即说明你的程序在什么环境下运行,怎么运行等。
(7) 附录源程序文件名,实验结束时源程序的电子稿要归档。
数据结构与算法实验时间安排(32学时)数据结构与算法实验时间安排(16学时)数据结构实验报告示例约瑟夫环一、需求分析1、实验任务是用循环单链表(不带头结点)来实现约瑟夫环。
循环单链表的结点结构中包含环内代表人的编号和密码。
2、对于输入的人数(n)和n个密码,建立不带头结点的单循环链表。
3、对于密码m,从相对的第一个人开始报到第m个人,输出相对于开始报数的第m个人的信息。
4、输出过程及输出完n个人的信息,即实现了约瑟夫环的功能。
5、测试数据m的初值设为6;(1) 对于n=7,7个人的密码依次为:3,1,7,2,4,8,4进行测试。
(2) 对于从键盘输入的n和n个人的密码进行测试。
二、概要设计1、数据类型(1) n个人的编号和密码的数据元素结构typedef struct // 用于接收数据的输入{int num;int m;}data;(2) 单向循环链表结点结构typedef struct node{ int num;int m;node *next;}node,*link;2、算法思想(1) 输入n个人的密码,分别和依次按1到n的编号,输入到一个结构体数组,以便为建立单循环链表作数据准备;(2) 根据结构体数组中的数据,建立单循环链表;(3) 由得到的单向循环链表,根据约瑟夫问题的要求,构造约瑟夫函数,该函数中设置2个指针p和 q,p指向当前报数的结点,q指向p结点后面的结点,开始时,q应指向单向循环链表的最后一个结点。
对于出列的人(结点),在该函数中输出其编号。
该函数被主函数调用。
(4) 在主函数中设置结构体数组,调用输入模块,把输入的n个人的密码和依次按1到n的编号,存储到一个结构体数组,然后调用建立有n个结点构成的单向循环链表的函数,最后调用约瑟夫函数,实现约瑟夫问题的求解。
3、各子模块(1) 输入数据模块该模块中输入n及n个人的编号和密码,依次存储于data类型的结构体数组;(2) 建立单循环链表模块该模块中根据结构数组中的数据,建立不带头结点的单循环链表,其结点中的数据是人的编号和密码;(3) 约瑟夫问题求解模块该模块中根据单向循环链表,从第一个人(结点)开始报数,报到密码m时(初始密码m可为6)该(人)结点出列,并输出相应的信息和得到新的密码,为下一次报数做准备,直至每个人(结点)全部出列,输出的信息即为约瑟夫问题的求解。
4、主模块及与子模块的调用关系(1) 主模块设置data类型的结构体数组和有关变量,然后依次调用输入数据模块、建立单循环链表模块和约瑟夫问题求解模块。
(2) 各模块之间的调用关系主程序模块输入数据模块建立单循环链表模块约瑟夫问题求解模块三、详细设计1、数据结构typedef struct{int num;int m;}data;typedef struct node{int num;int m;struct node *next;}node,*link;2、输入数据模块(用源代码也可以,但以伪代码比较好,下同)void inputdata(int n,data man[]){输入n;for i=0 to n-1{输入密码m;man i.num←i+1;man i.d←m;}}3、建立单循环链表模块void createlinklist(int n, data man[],link &l){link l,p,q;l←new node;l->num=←man0.num;l->m←man0.m;q=l;for i=1 to n-1{p=←new node;p->num=←man i.num;p->m←man i.m;q->next←p;q←p;}q->next←l;}4、约瑟夫问题求解模块void joseph(link l,int n){link q,p,s;m=6;q←l->next;while(q->next≠l) q←q->next;p←l;for i=0 to n-1 // 重复n次{for j=1 to m-1 // 找第m个人{q←p;p←p->next;}s←p;q->next←p->next;p←p->next;output s->num;m←s->m;delete s;}}5、主程序模块void main(){link l; int n;data man[100];input n;inputdata(n,man);createlinklist(n,man,l);joseph(l,n);}四、调试分析1、由于建立的是带头结点的单循环链表,导致输出的结果许多是错的,删除头结点,即建立的是不带头结点的单循环链表解决。
2、由于开始时没有指针指向要开始报数结点后的指针,导致当开始密码是1时不能删除第一个结点,出现输出乱的现象,经检查发现该错误,采用在joseph函数的开始就扫描单循环链表,使指针其指向单循环链表的最后一个结点,以便需要时能删除第一个结点,也就是说,在数结点时后面要跟一个指针,以便当数到要删除那个结点时,通过对后面跟着的指针所指结点的操作能删除数到的结点,这样就解决了这个问题。
这一点也提醒我们,单恋表中的操作,要删除结点,必须有指向其“前驱”结点的指针,否则是不能删除要删除的结点的。
3、由于先删除了结点空间,没有把被删结点中的密码保存,出现得到的密码不是被删结点的密码,而是被删结点下一个结点的密码,导致输出的信息不正确,修改成在删除结点空间前先保存其密码而解决。
4、算法的时间复杂度设约瑟夫问题中的人数为n,则建立单链表的时间复杂度是Ο(n),约瑟夫问题的求解模块中,要n次出列人,而每次出列人要走m个结点,设密码的平均值为m,则约瑟夫问题求解模块的时间复杂度为Ο(n×m)。
所以算法的时间复杂度为○(n)。
五、测试结果第一组:Input73 1 7 24 8 4Output6 1 47 2 3第二组:Input105 2 96 8 3 11 47 10Output6 97 2 4 5 3 18 10测试通过。
六、用户使用说明1、本程序的运行环境为windows操作系统下命令执行方式,执行文件为:exp1.exe;也可在VC集成环境下执行。