数据结构 教学计划编制问题 实验5报告

合集下载

数据结构课程设计实践报告

数据结构课程设计实践报告

数据结构课程设计实践报告数据结构课程设计实践报告1. 实验目的本次数据结构课程设计实践的目的是帮助学生掌握数据结构的基本概念,了解常见数据结构的实现原理,提高代码实现能力和问题解决能力。

2. 实验背景数据结构是计算机科学的基础课程,它是计算机科学的重要组成部分。

在计算机科学中,数据结构是针对计算机中的数据存储、管理和操作的方法论。

数据结构中的“数据”是指计算机中存储的各种信息,而“结构”则是指这些信息之间的相互关系。

常见的数据结构包括数组、链表、栈、队列、树和图等。

3. 实验内容本次数据结构课程设计实践包括以下内容:3.1 栈和队列实现一个基于栈和队列的计算器程序,能够进行加减乘除等基本运算和括号运算。

3.2 链表与树实现一个简单的文件系统,包括文件的创建、删除、移动、复制等操作,利用链表实现文件存储,利用树来实现文件目录结构。

3.3 图实现最短路径算法,并利用Graphviz工具将结果可视化展示出来。

4. 实验过程我们小组首先进行了团队分工,每个成员负责一个模块的代码实现,同时进行代码审查。

我们使用C++语言进行编码实现,采用面向对象设计思想,将每个数据结构封装成一个类,方便日后的调用和扩展。

在实现栈和队列的计算器程序时,我们使用了双栈法来进行括号运算的处理,使用队列来实现多项式的存储和输出。

在实现文件系统时,我们构建了一颗树形结构来表示文件的目录结构,同时在每个节点处保存了一个链表,来存储该目录下的文件信息,方便进行操作。

在实现最短路径算法时,我们采用了Dijkstra算法,并使用Graphviz 工具将结果可视化展示出来。

5. 实验结果我们小组经过不断尝试和调试,最终实现了所有要求的功能,并达到了预期的效果。

我们在实验过程中遇到的问题,如链表的指针操作、树的遍历方法以及Dijkstra算法的实现等,我们通过文献资料的查阅和团队讨论得以解决。

6. 实验总结通过本次数据结构课程设计实践,我们加深了对数据结构的理解和掌握,同时也提高了我们的编程能力和问题解决能力。

数据结构课程设计实验报告完整版

数据结构课程设计实验报告完整版

数据结构课程设计实验报告完整版【正文】一、实验目的本实验主要目的是通过实践,掌握数据结构的基本概念、常见数据结构的实现方式以及在实际应用中的应用场景和效果。

二、实验背景数据结构是计算机科学与技术领域中的一个重要概念,是研究数据的组织方式、存储方式、访问方式以及操作等方面的方法论。

在计算机科学领域,数据结构是实现算法和解决问题的基础,因此对数据结构的理解和应用具有重要意义。

三、实验内容本次数据结构课程设计实验主要分为以下几个部分:1. 实验环境的准备:包括选择合适的开发平台、安装必要的软件和工具。

2. 实验数据的收集和处理:通过合适的方式收集实验所需的数据,并对数据进行处理和整理。

3. 数据结构的选择和实现:根据实验需求,选择合适的数据结构,并进行相应的数据结构实现。

4. 数据结构的测试和优化:对所实现的数据结构进行测试,包括性能测试和功能测试,并根据测试结果对数据结构进行优化和改进。

5. 实验报告的撰写:根据实验过程和结果,撰写完整的实验报告,包括实验目的、实验背景、实验内容、实验结果和结论等。

四、实验过程1. 实验环境的准备本实验选择了Visual Studio作为开发平台,安装了相应版本的Visual Studio,并根据官方指引进行了相应的配置和设置。

2. 实验数据的收集和处理本实验选取了一份包含学生信息的数据集,包括学生姓名、学号、性别、年龄等信息。

通过编写Python脚本,成功提取了所需信息,并对数据进行了清洗和整理。

3. 数据结构的选择和实现根据实验需求,我们选择了链表作为数据结构的实现方式。

链表是一种常见的动态数据结构,能够高效地插入和删除元素,适用于频繁插入和删除的场景。

在实现链表时,我们定义了一个节点结构,包含数据域和指针域。

通过指针的方式将节点连接起来,形成一个链式结构。

同时,我们还实现了相关的操作函数,包括插入、删除、查找等操作。

4. 数据结构的测试和优化在完成链表的实现后,我们对其进行了性能测试和功能测试。

数据结构实验报告5(电大)

数据结构实验报告5(电大)

实验报告五查找(学科:数据结构)姓名单位班级学号实验日期成绩评定教师签名批改日期实验名称:实验五查找5.1 折半查找【问题描述】某班学生成绩信息表中,每个学生的记录已按平均成绩由高到低排好序,后来发现某个学生的成绩没有登记到信息表中,使用折半查找法把该同学的记录插入到信息表中,使信息表中的记录仍按平均成绩有序。

【基本信息】(1)建立现有学生信息表,平均成绩已有序。

(2)输入插入学生的记录信息。

(3)用折半查找找到插入位置,并插入记录。

【测试数据】自行设计。

【实验提示】(1)用结构数组存储成绩信息表。

(2)对记录中的平均成绩进行折半查找。

【实验报告内容】设计程序代码如下:#include<stdio.h>#include<string.h>#define N 5struct student{char name[10];float avg;}void insort(struct student s[],int n){int low,hight,mid,k;char y[10];float x;low=1;hight=n;strcpy(y,s[0].name );x=s[0].avg ;while(low<=hight){mid=(low+hight)/2;if(x>s[mid].avg )hight=mid-1;elselow=mid+1;}for(k=0;k<low-1;k++){strcpy(s[k].name,s[k+1].name) ;s[k].avg =s[k+1].avg ;}printf("%d",low);strcpy(s[low-1].name ,y) ;s[low-1].avg =x;}void main(){Struct student a[N]={{"caozh",96},{"cheng",95},{"zhao",93},{"wang",92},{"chen",91}};struct student stu[N];int i;for(i=0;i<N;i++)stu[i+1]=a[i];printf("初始%d 位同学的信息表\n",MAX);printf("排名姓名平均分数\n");for(i=1;i<=N;i++)printf("%d: %6s %3.2f\n",i,stu[i].name,stu[i].avg);printf("\n");printf("\n");printf("请输入学生的姓名:");scanf("%s",stu[0].name );printf("\n");printf("请输入平均成绩:");scanf("%f",&stu[0].avg );printf("\n");insort(stu,N);printf("折半排序后同学的信息表\n",MAX);printf("排名姓名平均分数\n");for(i=0;i<=N;i++){printf("%d: %6s %3.2f\n",i+1,stu[i].name,stu[i].avg);}printf("\n");}程序运行结果如下:5.2 二叉排序树的建立【问题描述】参阅相关资料,阅读建立二叉排序树的程序。

数据结构课程实验报告

数据结构课程实验报告

数据结构课程实验报告一、实验目的。

本次实验旨在通过对数据结构课程所学知识的应用,加深对数据结构相关算法和数据操作的理解,提高学生的编程能力和实际应用能力。

二、实验内容。

1. 实现顺序表、链表、栈、队列等数据结构的基本操作;2. 设计并实现数据结构相关算法,如查找、排序等;3. 进行实验数据的输入、输出和结果展示;4. 对实验结果进行分析和总结。

三、实验过程。

1. 针对顺序表、链表、栈、队列等数据结构,首先进行了相关操作的实现。

在实现过程中,需要考虑数据结构的特点和操作规则,确保操作的正确性和高效性。

2. 针对数据结构相关算法,如查找、排序等,设计并实现了相应的算法。

在实现过程中,需要考虑算法的时间复杂度和空间复杂度,确保算法的效率和稳定性。

3. 进行了实验数据的输入、输出和结果展示。

通过编写测试用例,对实现的数据结构和算法进行了测试,验证其正确性和可靠性。

4. 对实验结果进行了分析和总结。

通过对实验数据和测试结果的分析,总结了实验中遇到的问题和解决方法,以及实验的收获和体会。

四、实验结果。

经过实验测试,实现的数据结构和算法均能正确运行并得到预期的结果。

通过实验,加深了对数据结构相关知识的理解,提高了编程能力和实际应用能力。

五、实验总结。

本次实验使我对数据结构相关知识有了更深入的理解,同时也提高了我的编程能力和实际应用能力。

在未来的学习和工作中,我将继续努力,不断提升自己的能力,为将来的发展打下坚实的基础。

六、实验感想。

通过本次实验,我深刻感受到了数据结构在实际应用中的重要性,也意识到了自己在数据结构方面的不足之处。

在今后的学习和工作中,我将更加努力地学习和应用数据结构知识,不断提高自己的能力,为未来的发展做好充分的准备。

七、参考文献。

1. 《数据结构与算法分析》。

2. 《C语言程序设计》。

3. 《数据结构课程实验指导书》。

以上就是本次数据结构课程实验的报告内容,希望能对大家有所帮助。

感谢您的阅读!。

数据结构实验报告十—教学计划编制问题

数据结构实验报告十—教学计划编制问题

问题描述:若用有向网表示教学计划,其中顶点表示某门课程,有向边表示课程之间的先修关系(如果A课程是B课程的先修课程,那么A到B之间有一条有向边从A 指向B)。

试设计一个教学计划编制程序,获取一个不冲突的线性的课程教学流程。

(课程线性排列,每门课上课时其先修课程已经被安排)。

基本要求:(1)输入参数:课程总数,每门课的课程号(固定占3位的字母数字串)和直接先修课的课程号。

(2)若根据输入条件问题无解,则报告适当的信息;否则将教学计划输出到用户指定的文件中。

一、需求分析:本程序需要基于图的基本操作来实现二、概要设计:抽象数据类型:为实现上述功能需建立一个结点类,线性表类,图类。

算法的基本思想:1、图的构建:建立一个结点类,类的元素有字符型变量用来存储字母,整形变量用来存储位置,该类型的指针,指向下一个元素。

建立一个线性表类,完成线性表的构建。

建立一个图类,完成图的信息的读取,(如有n个点,则建立n 个线性表,将每个结点与其指向的结点组成一个线性表,并记录线性表的长度)。

2、Topsort算法:先计算每个点的入度,保存在数组中。

找到第一个入度为0的点,将该点所连的各点的入度减一。

再在这些点中找入度为0 的点。

如果找到,重复上述操作。

如果找不到,则跳出while循环,再搜索其他的点,看入度是否为0。

再重复上述操作,如果所有的入度为0的点都被寻找到,但个数少于输入顶点的个数,说明该图存在环。

程序的流程程序由三个模块组成:输入模块:读入图的信息(顶点和边,用线性表进行存储)。

处理模块:topsort算法。

输出模块:将结果输出。

三、详细设计算法的具体步骤:class Node{ead->node=ch;line[i].head->position=i;}}void pushEdge(){ ead->node==ch1)pos1=j; ead->node==ch2){pos2=line[j].head->position;break;}}line[pos1].insert(pos2,ch2);}}void topsort(){ ead;while(p->next!=NULL){d[p->next->position]++; ead->node<<" ";m++;Node* p=line[j].head;while(p->next!=NULL){k=p->next->position;d[k]--;ead->node=ch;line[i].head->position=i;}}void pushEdge(){ ead->node==ch1)pos1=j; ead->node==ch2){pos2=line[j].head->position;break;}}line[pos1].insert(pos2,ch2);}}void topsort(){ ead;while(p->next!=NULL){d[p->next->position]++; ead->node<<" ";m++;Node* p=line[j].head;while(p->next!=NULL){k=p->next->position;d[k]--; //当起点被删除,时后面的点的入度-1if(d[k]==0){d[k]=top;top=k;}p=p->next;}}}cout<<endl;if(m<numVertex) //输出点的个数小于输入点的个数,不能完全遍历 cout<<"网络存在回路"<<endl;delete []d;}};int main(){int n,m;cout<<"请输入节点的个数和边的个数"<<endl;cin>>n>>m;Graph G(n,m);();();();system("pause");return 0;}。

数据结构 实验报告

数据结构 实验报告

数据结构实验报告数据结构实验报告一、引言数据结构是计算机科学中非常重要的一门课程,它涉及到数据的存储、组织和管理等方面。

通过实验学习,我们可以更好地理解和掌握不同的数据结构,提升我们在编程中解决实际问题的能力。

二、实验目的本次实验的主要目的是通过实际操作,加深对数据结构的理解,学习并掌握不同数据结构的特点和应用场景,提高编程能力。

三、实验内容1. 实验环境的搭建在开始实验之前,我们需要搭建相应的实验环境。

首先,我们选择合适的集成开发环境(IDE),如Eclipse或IntelliJ IDEA,并安装好Java Development Kit(JDK)。

然后,根据实验要求,下载并安装相应的数据结构库或框架。

2. 实验一:线性表线性表是最基本且最常用的数据结构之一,它可以用于存储一系列具有相同数据类型的元素。

实验中,我们需要实现一个线性表的基本操作,包括插入、删除、查找、修改等。

3. 实验二:栈和队列栈和队列是两种常用的数据结构,它们都是线性表的衍生结构,但在操作上有一些特殊的限制。

实验中,我们需要实现栈和队列的基本操作,并比较它们在不同场景下的优劣。

4. 实验三:树和二叉树树是一种非线性的数据结构,它以分层的方式存储数据。

二叉树是树的一种特殊情况,其中每个节点最多只有两个子节点。

实验中,我们需要实现树和二叉树的构建和遍历算法,并掌握它们在实际问题中的应用。

5. 实验四:图图是一种非线性的数据结构,由节点和边组成。

实验中,我们需要实现图的构建和遍历算法,并应用它们解决实际的图相关问题。

四、实验结果与分析通过实验,我们得到了以下结果和分析:1. 在线性表实验中,我们成功实现了插入、删除、查找和修改等基本操作,并验证了其正确性和效率。

2. 在栈和队列实验中,我们对比了它们在不同场景下的应用,发现栈适用于后进先出(LIFO)的情况,而队列适用于先进先出(FIFO)的情况。

3. 在树和二叉树实验中,我们掌握了树和二叉树的构建和遍历算法,并应用它们解决了一些实际问题,如树形结构的存储和搜索。

数据结构实验报告5

数据结构实验报告5

数据结构实验报告5正文:1. 引言本实验报告旨在介绍数据结构的相关概念和算法,并通过具体案例分析展示其应用。

该报告包含以下章节:背景知识、实验目标、方法与步骤、结果与讨论以及总结。

2. 背景知识在开始进行实验之前,我们需要了解一些基础的数据结构概念,如数组、链表等。

此外还需掌握常见的排序算法(例如冒泡排序和快速排序)以及查找算法(例如二分查找)。

这些基础知识将为后续实验提供必要支持。

3. 实验目标本次实验有两个主要目标:- 理解并独立编写各种数据结构;- 探索不同类型的问题,并使用适当的数据结构来解决它们;4. 方法与步骤4.1 数据集准备阶段:首先,我们需要选择一个合适且真是性质良好地测试样例作为输入。

然后根据所选题型设计相应规模大小或特殊情形下得到期望输出值。

最后对于每组样例都能够正确运行程序代码而产生预期答案即可进入下一环节。

4.2 编码阶段:按照给定任务的要求,使用合适的数据结构和算法编写代码。

确保程序能够正确地处理各种输入情况,并返回预期结果。

4.3 测试与分析阶段:对于每个实验样例,我们需要进行测试以验证其准确性。

通过比较输出结果与预期答案来判断是否成功解决问题。

同时还需考虑时间复杂度、空间复杂度等因素评估所设计算法的效率及优劣程度。

5. 结果与讨论在本节中将展示并讨论实验过程中得到的具体结果。

包括但不限于:- 算法运行时间;- 内存占用情况;- 输出正确性;6. 总结总结报告内容,并回顾整个实验流程和成果。

指出可能存在改进之处或者未来可以深入研究探索领域。

附件:(请参见相关文件)注释:1)数组:一组连续内存单元集合,在计算机科学中广泛应用。

2)链表:由节点组成线性序列,其中每一个节点都连接着下一个节点地址信息。

数据结构课程实验报告

数据结构课程实验报告

数据结构课程实验报告一、实验目的本次数据结构课程实验的主要目的是通过实践掌握常见数据结构的基本操作,包括线性结构、树形结构和图形结构。

同时,也要求学生能够熟练运用C++语言编写程序,并且能够正确地使用各种算法和数据结构解决具体问题。

二、实验内容本次实验涉及到以下几个方面:1. 线性表:设计一个线性表类,并且实现线性表中元素的插入、删除、查找等基本操作。

2. 栈和队列:设计一个栈类和队列类,并且分别利用这两种数据结构解决具体问题。

3. 二叉树:设计一个二叉树类,并且实现二叉树的遍历(前序遍历、中序遍历和后序遍历)。

4. 图论:设计一个图类,并且利用图论算法解决具体问题(如最短路径问题)。

三、实验过程1. 线性表首先,我们需要设计一个线性表类。

在这个类中,我们需要定义一些成员变量(如线性表大小、元素类型等),并且定义一些成员函数(如插入元素函数、删除元素函数等)。

在编写代码时,我们需要注意一些细节问题,如边界条件、异常处理等。

2. 栈和队列接下来,我们需要设计一个栈类和队列类。

在这两个类中,我们需要定义一些成员变量(如栈顶指针、队头指针等),并且定义一些成员函数(如入栈函数、出栈函数、入队函数、出队函数等)。

在编写代码时,我们需要注意一些细节问题,如空间不足的情况、空栈或空队列的情况等。

3. 二叉树然后,我们需要设计一个二叉树类,并且实现二叉树的遍历。

在这个类中,我们需要定义一个节点结构体,并且定义一些成员变量(如根节点指针、节点数量等),并且定义一些成员函数(如插入节点函数、删除节点函数、遍历函数等)。

在编写代码时,我们需要注意一些细节问题,如递归调用的情况、空节点的情况等。

4. 图论最后,我们需要设计一个图类,并且利用图论算法解决具体问题。

在这个类中,我们需要定义一个邻接矩阵或邻接表来表示图形结构,并且定义一些成员变量(如顶点数量、边的数量等),并且定义一些成员函数(如添加边函数、删除边函数、最短路径算法等)。

数据结构课程实验报告

数据结构课程实验报告

数据结构课程实验报告数据结构课程实验报告引言:数据结构是计算机科学中非常重要的一门课程,它研究了数据的组织、存储和管理方法。

在数据结构课程中,我们学习了各种数据结构的原理和应用,并通过实验来加深对这些概念的理解。

本文将对我在数据结构课程中的实验进行总结和分析。

实验一:线性表的实现与应用在这个实验中,我们学习了线性表这种基本的数据结构,并实现了线性表的顺序存储和链式存储两种方式。

通过实验,我深刻理解了线性表的插入、删除和查找等操作的实现原理,并掌握了如何根据具体应用场景选择合适的存储方式。

实验二:栈和队列的实现与应用栈和队列是两种常见的数据结构,它们分别具有后进先出和先进先出的特点。

在这个实验中,我们通过实现栈和队列的操作,加深了对它们的理解。

同时,我们还学习了如何利用栈和队列解决实际问题,比如迷宫求解和中缀表达式转后缀表达式等。

实验三:树的实现与应用树是一种重要的非线性数据结构,它具有层次结构和递归定义的特点。

在这个实验中,我们学习了二叉树和二叉搜索树的实现和应用。

通过实验,我掌握了二叉树的遍历方法,了解了二叉搜索树的特性,并学会了如何利用二叉搜索树实现排序算法。

实验四:图的实现与应用图是一种复杂的非线性数据结构,它由节点和边组成,用于表示事物之间的关系。

在这个实验中,我们学习了图的邻接矩阵和邻接表两种存储方式,并实现了图的深度优先搜索和广度优先搜索算法。

通过实验,我深入理解了图的遍历方法和最短路径算法,并学会了如何利用图解决实际问题,比如社交网络分析和地图导航等。

实验五:排序算法的实现与比较排序算法是数据结构中非常重要的一部分,它用于将一组无序的数据按照某种规则进行排列。

在这个实验中,我们实现了常见的排序算法,比如冒泡排序、插入排序、选择排序和快速排序等,并通过实验比较了它们的性能差异。

通过实验,我深入理解了排序算法的原理和实现细节,并了解了如何根据具体情况选择合适的排序算法。

结论:通过这些实验,我对数据结构的原理和应用有了更深入的理解。

数据结构实验报告(实验)

数据结构实验报告(实验)

数据结构实验报告(实验)数据结构实验报告(实验)1. 实验目的1.1 理解数据结构的基本概念和操作1.2 学会使用数据结构解决实际问题1.3 掌握常用数据结构的实现和应用2. 实验环境2.1 操作系统:Windows 102.2 编程语言:C++2.3 开发工具:Visual Studio3. 实验内容3.1 实验一:线性表的实现和应用3.1.1 设计并实现线性表的基本操作函数3.1.2 实现线性表的插入、删除、查找等功能 3.1.3 实现线性表的排序算法3.1.4 应用线性表解决实际问题3.2 实验二:栈和队列的实现和应用3.2.1 设计并实现栈的基本操作函数3.2.2 设计并实现队列的基本操作函数3.2.3 实现栈和队列的应用场景3.2.4 比较栈和队列的优缺点3.3 实验三:树的实现和应用3.3.1 设计并实现二叉树的基本操作函数3.3.2 实现二叉树的创建、遍历和查找等功能3.3.3 实现树的遍历算法(前序、中序、后序遍历)3.3.4 应用树解决实际问题4. 数据结构实验结果4.1 实验一的结果4.1.1 线性表的基本操作函数实现情况4.1.2 线性表的插入、删除、查找功能测试结果4.1.3 线性表的排序算法测试结果4.1.4 线性表解决实际问题的应用效果4.2 实验二的结果4.2.1 栈的基本操作函数实现情况4.2.2 队列的基本操作函数实现情况4.2.3 栈和队列的应用场景测试结果4.2.4 栈和队列优缺点的比较结果4.3 实验三的结果4.3.1 二叉树的基本操作函数实现情况4.3.2 二叉树的创建、遍历和查找功能测试结果 4.3.3 树的遍历算法测试结果4.3.4 树解决实际问题的应用效果5. 实验分析与总结5.1 实验问题与解决方案5.2 实验结果分析5.3 实验总结与心得体会6. 附件附件一:实验源代码附件二:实验数据7. 法律名词及注释7.1 版权:著作权法规定的对原创作品享有的权利7.2 专利:国家授予的在一定时间内对新型发明享有独占权利的证书7.3 商标:作为标识企业商品和服务来源的标志的名称、符号、图案等7.4 许可协议:指允许他人在一定条件下使用自己的知识产权的协议。

教学计划编制问题 数据结构课程设计报告 湖南工程学院

教学计划编制问题 数据结构课程设计报告 湖南工程学院

课程设计报告课程名称数据结构课程设计课题名称教学计划编制问题专业网络工程班级 0901学号 2009031201XX姓名指导教师刘长松陈华光李杰君2011年 7 月 15 日湖南工程学院课程设计任务书课程名称数据结构课程设计课题教学计划编制问题专业班级网络工程0901 学生姓名 X X学号 2009031201XX 指导老师刘长松陈华光李杰君审批任务书下达日期: 2011 年 6 月 26 日任务完成日期:2011 年 7 月 15 日一、设计内容与设计要求1.设计内容:1)问题描述大学的每个专业都要制订教学计划。

假设任何专业都有固定的学习年限,每学年含两学期,每学期的时间长度和学分上限均相等。

每个专业开设的课程都是确定的,而且课程在开设时间的安排必须满足先修关系。

每门课程有哪些先修课程是确定的,可以有任意多门,也可以没有。

每门课恰好占一个学期。

试在这样的前提下设计一个教学计划编制程序。

2)基本要求a.输入参数包括:学期总数,一学期的学分上限,每门课的课程号(固定占3位的字母数字串)、学分和直接先修课的课程号。

b.允许用户指定下列两种编排策略之一:一是使学生在各学期中的学习负担尽量均匀;二是使课程尽可能地集中在前几个学期中。

c.若根据给定的条件问题无解,则报告适当的信息;否则,将教学计划输出到用户指定的文件中。

计划的表格格式自行设计。

3)测试数据学期总数:6;学分上限:10;该专业共开设课数:12课程号:从C01到C12;学分顺序:2,3,4,3,2,3,4,4,7,5,2,3。

先修关系如下图:4)实现提示可设学期总数不超过12,课程总数不超过100。

如果输入的先修课程号不在该专业开设的课程序列中,则作为错误处理。

应建立内部课程号与课程号之间的对应关系。

2.设计要求:课程设计报告规范1)需求分析a.程序的功能。

b.输入输出的要求。

2)概要设计a.程序由哪些模块组成以及模块之间的层次结构、各模块的调用关系;每个模块的功能。

数据结构课程设计实验报告

数据结构课程设计实验报告

数据结构课程设计实验报告目录1.单位员工通讯录管理系统(线性表的应用)*********************2.停车场管理(栈和队列的应用)*******************************3.哈夫曼编码/译码系统(树应用)******************************4.教学计划编制问题(图的应用)*******************************5.药店的药品销售统计系统(排序应用**************************6.综合排序(**)*******************************************7.迷宫求解***************************************************8.总结*******************************************************9.源代码*****************************************************一.单位员工通讯录管理系统(线性表的应用)1.设计题目:单位员工通讯录管理系统(线性表的应用)2.问题描述:为某个单位建立一个员工通讯录管理系统,可以方便查询每一个员工的办公室电话、手机号。

其功能包括通讯录链表的建立、员工通讯信息的查询、修改、插入与删除、以及整个通讯录表的输出。

3.需求分析:随着社会的发展,越来越多的工厂建立。

为了便于管理单位员工和方便员工之间的交流,员工的各项信息的统计,查询和修改,删除等显得很重要。

基于上面的种种原因,在学习过数据结构课程和其他编程语言的基础上编成了一个单位员工通讯录管理系统,便于单位对员工的管理和员工间的交流。

4.算法设计:本程序使用的数据结构中的线性表中的知识,在C语言的基础上编的。

首先,应该建立一个单链表,链表的节点信息表存的有单位员工的编号,姓名,手机号码和办公室电话,然后我们就可以添加员工的各项信息了。

数据结构实验报告实验5

数据结构实验报告实验5

数据结构实验报告实验5一、实验目的本次实验的主要目的是深入理解和掌握常见的数据结构,如链表、栈、队列、树和图等,并通过实际编程实现,提高对数据结构的操作和应用能力。

同时,培养解决实际问题的思维和编程能力,提高代码的可读性、可维护性和效率。

二、实验环境本次实验使用的编程语言为C++,开发环境为Visual Studio 2019。

三、实验内容1、链表的基本操作创建链表插入节点删除节点遍历链表2、栈的实现与应用用数组实现栈用链表实现栈栈的应用:括号匹配3、队列的实现与应用用数组实现队列用链表实现队列队列的应用:排队模拟4、二叉树的遍历前序遍历中序遍历后序遍历5、图的表示与遍历邻接矩阵表示法邻接表表示法深度优先遍历广度优先遍历四、实验步骤1、链表的基本操作创建链表:首先定义一个链表节点结构体,包含数据域和指向下一个节点的指针域。

然后通过动态内存分配创建链表节点,并将节点逐个连接起来,形成链表。

插入节点:根据插入位置的不同,分为在表头插入、在表尾插入和在指定位置插入。

在指定位置插入时,需要先找到插入位置的前一个节点,然后进行节点的连接操作。

删除节点:同样需要根据删除位置的不同进行处理。

删除表头节点时,直接将头指针指向下一个节点;删除表尾节点时,找到倒数第二个节点,将其指针置为空;删除指定位置节点时,找到要删除节点的前一个节点,然后调整指针。

遍历链表:通过从链表头开始,依次访问每个节点,输出节点的数据。

2、栈的实现与应用用数组实现栈:定义一个固定大小的数组作为栈的存储空间,同时用一个变量记录栈顶位置。

入栈操作时,先判断栈是否已满,如果未满则将元素放入栈顶位置,并更新栈顶位置;出栈操作时,先判断栈是否为空,如果不空则取出栈顶元素,并更新栈顶位置。

用链表实现栈:与链表的操作类似,将新元素添加在链表头部作为栈顶。

括号匹配:输入一个包含括号的字符串,使用栈来判断括号是否匹配。

遇到左括号入栈,遇到右括号时与栈顶的左括号进行匹配,如果匹配成功则出栈,否则括号不匹配。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

HUNAN UNIVERSITY 实验五最终报告题目:教学计划编制问题学生姓名学生学号专业班级指导老师完成日期2014年5月15日一、需求分析1.输入形式:用户通过键盘输入课程总数、每门课的课程编号(固定占3位的字母数字串)和直接先修的课程号等的参数。

不对非法输入做处理,假定输入的数据都合法。

2.输出形式:如果拓扑排序成功,输出拓扑排序后的教学计划编制的顺序;如果拓扑排序不成功,输出排序错误信息,结束程序。

3.程序功能:对于用户输入的一组课程编号,根据输入的先修顺序创建邻接矩阵进行存储,并输出拓扑排序后的课程编号的顺序。

4.测试数据输入:输入课程总数:3输入每门课的课程编号:A01是否有直接先修的课程(T/F):F输入每门课的课程编号:A02是否有直接先修的课程(T/F):T先修课程编号:A01是否有直接先修的课程(T/F):F输入每门课的课程编号:A03是否有直接先修的课程(T/F):T先修课程编号:A02是否有直接先修的课程(T/F):F输出:教学计划编制完成,课程修读顺序为:A01,A02,A03(输入有误)课程输入错误!教学计划编制失败,请重新输入。

二、概要设计抽象数据类型题设要求使用一个有向图表示教学计划,顶点表示某门课程,有向边表示课程之间的先修关系,数据的对象是图中的每一个顶点和有向边。

由此为本问题确定一个图的数据关系。

拓扑排序可以用顶点入度为0的方法实现,所以为实现拓扑排序的顶点顺序的存放,创建一个队列来存放。

图的ADT数据对象:V,R(分别代表某门课程的顶点组成的一个顶点集 V 和代表课程先修关系的有向弧边组成的一个弧集 R。

)数据关系:VR={<v,w>| v,w∈V 且P(v,w)}<v,w>表示从v 到w 的一条弧,并称v 为弧头,w 为弧尾。

基本操作:int n(); //返回图中的顶点数int first(int); //返回该点的第一条邻边int next(int); //返回该店的下一条邻边void setEdge(int,int,int); //为有向边设置权值int getMark(int); //获得顶点的标志值void setMark(int); //为顶点设置标志值队列ADT数据对象:int数据关系:R={<a i-1 ,a i>|a i-1,a i∈car,i=1,2,3….n}约定a1 为队列头,an为队列尾。

基本操作:queue(); //队列结构初始化~queue(); //结构销毁操作bool push(const int& it); //数据入列bool pop(int& it); //数据出列int size(); //获取队列长度算法的基本思想通过用户输入的顶点的个数(课程数)初始化一个表示有向图的相邻矩阵,课程编号作为相邻矩阵的行列值以及有向边的关系(课程先修关系)完成一个有向图的构建。

为了检验图中顶点是否都经过拓扑排序,为每个顶点初始化一个标志值0,当一个顶点经过拓扑排序后更改该顶点标志值0。

对相邻矩阵棕的顶点进行入度为0的方法进行拓扑排序。

排序结束后,遍历一次图中所有顶点的标志值,当有一个标志值为0时,输出错误信息,结束程序。

否则,排序成功,输出排序后的顶点序列。

程序的流程(1)初始化模块:输入课程总数,再输入相应数量的课程编号及每个课程的先修课程,用这些信息初始化一个有向图。

(2)拓扑排序模块:对有向图进行拓扑排序。

(3)输出模块:根据有向图是否为空输出。

为空时,输出拓扑排序结果;不为空时输出输入错误提示。

各层次模块之间的调用关系三、详细设计物理数据类型由于用户输入的课程个数不定,所以存储拓扑排序后的顶点的个数不定,由此用链式队列来存储排序后的顶点。

为了检查图中是否有回路,把每一个顶点的标志值初始化为0。

(一)有向图的基本操作1.初始化一个有向图Graphm(int numVert){int i,j;numVertex = numVert; //顶点数numEdge=0;mark=new int[numVert]; //初始化标志数组for(i=0;i<numVertex;i++)mark[i]=0; //每一个顶点的标志值初始化为0matrix =(int**) new int*[numVertex];for(i=0;i<numVertex;i++)matrix[i]=new int[numVertex]; //构建一个相邻矩阵for(i=0;i<numVertex;i++)for(j=0;j<numVertex;j++)matrix[i][j]=0;}2.有向图的销毁~Graphm(){delete []mark;for(int i=0;i<numVertex;i++)delete [] matrix[i];delete [] matrix; //销毁相邻矩阵}3.获取第一个邻居int first(int v) //返回该点的第一条邻边{int i;for(i=0;i<numVertex;i++)if(matrix[v][i]!=0) return i; //当顶点和顶点i有边时,返回顶点i的值return i;}int next(int v1,int v2) //获得v1的邻居v2{int i;for(i=v2+1;i<numVertex;i++)if(matrix[v1][i]!=0) return i;return i;}4.其他基本操作void setEdge(int v1,int v2) //设置有向图的边{if(matrix[v1][v2]==0)numEdge++;matrix[v1][v2]=1;}int getMark(int v) //获取顶点标记的值{return mark[v];}int setMark(int v,int val) //设置访问的标记{mark[v]=val;}(二)拓扑排序找到第一个入度为0 的点存入队列中,从有向图中删去此顶点以及所有以它为尾的弧,再在这些点中找入度为0 的点。

重复上述操作,直至图空,或者图不空但找不到无前驱的顶点为止,此时返回该队列。

queue<int> topsort(Graphm G,queue<int> Q,queue<int> L, int n ){int count[100];int v,w,i;for(v=0;v<n;v++){count[v]=0;}for(v=0;v<n;v++)for(w=G.first(v);w<n;w=G.next(v,w))count[w]++;for(v=0;v<n;v++)if(count[v]==0) //找到度为0的点{ Q.push(v); G.setMark(v,1); } //顶点进队列,并更改顶点标志值为1 while(Q.size()!=0){i=Q.front();Q.pop();L.push(i);for(w=G.first(i);w<n;w=G.next(i,w)){count[w]--; //顶点度减一if(count[w]==0) //找到度为0的点{Q.push(w); G.setMark(w,1); } //顶点进队列,并更改顶点标志值为1 }}return L; //返回存放排序后顶点的队列}(三)队列基本操作//压入队列bool pop(char*& it){if(length()==0) return false;it=front->elem;qnode* ltemp=front;front=front->next;delete ltemp;if(front==NULL) rear=NULL;size--;return true;}//出队列bool push(const char*& it){if(rear==NULL)front=rear=new qnode(it,NULL);else //append{rear->next=new qnode(it,NULL);rear=rear->next;}size++;return true;}//获取队列长度int size() const{ return size; }最后,判断图中是否有回路。

可以通过遍历图中的每一个顶点的标记值,如果有一个为0,那么说明图中存在回路。

for(i=0;i<n;i++){ if(G.getMark(i)==0) //为0时表示该顶点未经过拓扑排序{ cout<<"课程输入错误!教学计划编制失败,请重新输入。

"<<endl;exit(0); } }算法的具体步骤创建一个数组存储顶点信息,再构建一个邻接矩阵存储输入的课程编号(顶点),和课程先修关系(有向边)构成的有向图的信息,然后对邻接矩阵中的图的信息进行拓扑排序,把排序结果存放在一个队列中。

如果一次排序结束后,遍历顶点标志值有为0,输出输入错误提示,结束程序;否则,输出队列中存储的课程编号序列。

流程图如下:伪代码如下,char v[100][5];char v1[4],v2[4];Graphm T;queue<int> S;cin.get(n); //输入课程总数nT.CreatGraphm(n);cin.get(v); //输入每门课的编号,保存在*v[4]数组中for(i=0;i<n;i++){cout<<v[i]<<"---是否有直接先修的课程(T/F):";cin>>ch;while(ch=='T'){GetNum(n2); //输入先修课程编号T.setEdge(n2,i); //n2在前表示先修的顺序cout<<"是否有直接先修的课程(T/F):";cin>>ch;}}S=topsort(T,Q,L,n); //对图T进行拓扑排序,排序序列存储在队列中返回到Scout<<"教学计划编制完成,课程修读顺序为:"<<endl;printout(S); //输出排序后的顶点序列}算法的时空分析及改进设想因为图的邻接矩阵是一个|V|×|V|矩阵,所以邻接矩阵的空间代价为Θ(|V|^2),对于有n个顶点的和E条弧的有向图而言,对此图的拓扑排序算法时间复杂度为Θ(V+E)输入和输出的格式输入:1.输入课程数n---- cin.get(n);cout<<"输入课程总数:";cin<<n;2.输入每门课的课程编号---- cin.get(v);for(i=0;i<n;i++){cout<<"输入每门课的课程编号:"<<endl;cin.get();cin.getline(v1,4);strcpy(v[i],v1); //要用字符串拷贝函数,用等号不能正确的赋值!!}3.获得先修的课程编号----GetNum(n2);cout<<"先修课程编号:";cin.get();in.getline(v2,4);n2=getNum(v,n,v2);输出:1.编制成功,把队列S中的顶点序列输出。

相关文档
最新文档