数据结构与算法实训课程实训报告
- 格式:doc
- 大小:131.50 KB
- 文档页数:12
数据结构与算法实验报告一、实验目的1.学习并掌握线性表的链式存储结构和链表的基本操作;2.掌握链表的插入、删除、查找等基本操作算法的实现;3.了解链表的应用场景。
二、实验内容与过程本次实验主要包括以下实验内容:1.链表的定义与建立;2.链表的插入操作;3.链表的删除操作;4.链表的查找操作;5.链表的遍历操作;6.链表的逆序操作;7.链表的合并操作。
实验过程如下:1.链表的定义与建立首先,我们定义一个链表的结构,其中包括节点的定义,节点的数据域和指针域。
节点的数据域存放具体的数据,指针域用于指向下一个节点。
```typedef struct Nodeint data;struct Node* next;} Node;```然后,我们定义链表的头指针,并初始化为空链表。
```Node* head = NULL;```2.链表的插入操作插入操作是指在链表中间或末尾插入一个新节点。
首先,我们创建一个新节点,并为其分配内存空间。
```Node* newNode = (struct Node*) malloc(sizeof(Node));newNode->data = 10;newNode->next = NULL;```然后,我们遍历链表,找到插入位置。
```Node* current = head;while (current->next != NULL)current = current->next;```最后,我们将新节点插入到链表中。
```current->next = newNode;```3.链表的删除操作删除操作是指删除链表中的一些节点。
首先,我们找到要删除的节点的前一个节点。
```Node* current = head;while (current->next != NULL && current->next->data != data) current = current->next;```然后,我们将要删除的节点的指针域赋值给前一个节点的指针域。
数据结构与算法分析实验报告一、实验目的本次实验旨在通过实际操作和分析,深入理解数据结构和算法的基本概念、原理和应用,提高解决实际问题的能力,培养逻辑思维和编程技巧。
二、实验环境本次实验使用的编程语言为 Python,使用的开发工具为 PyCharm。
操作系统为 Windows 10。
三、实验内容(一)线性表的实现与操作1、顺序表的实现使用数组实现顺序表,包括插入、删除、查找等基本操作。
通过实验,理解了顺序表在内存中的存储方式以及其操作的时间复杂度。
2、链表的实现实现了单向链表和双向链表,对链表的节点插入、删除和遍历进行了实践。
体会到链表在动态内存管理和灵活操作方面的优势。
(二)栈和队列的应用1、栈的实现与应用用数组和链表分别实现栈,并通过表达式求值的例子,展示了栈在计算中的作用。
2、队列的实现与应用实现了顺序队列和循环队列,通过模拟银行排队的场景,理解了队列的先进先出特性。
(三)树和二叉树1、二叉树的遍历实现了先序、中序和后序遍历算法,并对不同遍历方式的结果进行了分析和比较。
2、二叉搜索树的操作构建了二叉搜索树,实现了插入、删除和查找操作,了解了其在数据快速查找和排序中的应用。
(四)图的表示与遍历1、邻接矩阵和邻接表表示图分别用邻接矩阵和邻接表来表示图,并比较了它们在存储空间和操作效率上的差异。
2、图的深度优先遍历和广度优先遍历实现了两种遍历算法,并通过对实际图结构的遍历,理解了它们的应用场景和特点。
(五)排序算法的性能比较1、常见排序算法的实现实现了冒泡排序、插入排序、选择排序、快速排序和归并排序等常见的排序算法。
2、算法性能分析通过对不同规模的数据进行排序实验,比较了各种排序算法的时间复杂度和空间复杂度。
四、实验过程及结果(一)线性表1、顺序表在顺序表的插入操作中,如果在表头插入元素,需要将后面的元素依次向后移动一位,时间复杂度为 O(n)。
删除操作同理,在表头删除元素时,时间复杂度也为 O(n)。
数据结构与算法实训课程学习总结解决实际问题的高效数据结构与算法应用指南数据结构与算法实训课程学习总结:解决实际问题的高效数据结构与算法应用指南一、介绍在计算机科学领域,数据结构与算法是非常重要的基础知识。
学习数据结构与算法能够帮助我们更好地理解计算机程序的内部工作原理,使得我们能够更高效地解决实际问题。
本文总结了我在数据结构与算法实训课程中的学习经验,并提供了一些解决实际问题时使用高效数据结构与算法的指导。
二、实训课程概述数据结构与算法实训课程旨在帮助学生深入理解常用数据结构与算法,并通过实际编程项目锻炼学生的编码能力和问题解决能力。
课程分为理论学习和实践编程两个部分,通过理论讲解、编程实践和项目实战相结合的方式进行。
三、学习重点1. 数据结构的选择在解决实际问题时,选择合适的数据结构是至关重要的。
例如,对于需要频繁地插入和删除元素的问题,可以选择链表作为数据结构;对于需要高效查找元素的问题,可以选择散列表或二叉搜索树。
学习时要充分了解各种数据结构的特点及其适用场景,以便在实际问题中能够选择合适的数据结构。
2. 算法的效率除了选择合适的数据结构,算法的效率也是问题解决的关键。
通过学习不同的算法,并分析其时间复杂度和空间复杂度,我们能够选择最优的算法来解决实际问题。
例如,对于排序问题,可以选择快速排序或归并排序等高效的排序算法。
学习时要注重算法的实现细节,比如循环不变式、递归思想等。
3. 协同合作与项目管理在实际项目中,协同合作和项目管理也是非常重要的。
学习时可以结合团队项目来进行,通过合作完成给定的任务。
在项目中,我们不仅需要编写高效的代码,还要注重代码的可读性和可维护性,遵循良好的编码规范。
四、实践应用1. 搜索引擎排名优化在搜索引擎的排名优化中,数据结构与算法的应用非常广泛。
例如,利用散列表可以快速存储网页信息和关键字索引,以便进行快速的搜索;使用图算法可以分析网页之间的链接关系,进行网页排名计算。
数据结构与算法实验报告实验目的:1.加深对链表的理解,掌握链表的基本操作;2.掌握递归算法的设计思想及应用。
实验内容:本次实验主要包括两个部分的实现与测试,分别为链表的基本操作及递归算法的应用。
一、链表的基本操作1.链表的创建链表的创建主要包括新建链表头结点和逐个插入新结点两个步骤。
首先通过malloc函数新建一个链表头结点,并使链表头结点的指针域为空。
然后通过循环输入新节点的数据值,并将新节点插入到链表的尾部。
2.链表的插入链表的插入操作主要包括在链表头部插入新节点、在链表尾部插入新节点和在链表中间插入新节点。
在插入链表头部时,首先通过malloc函数生成新节点,并将链表头节点指针域的原指向设置为新节点;在插入链表尾部时,首先通过循环找到链表的尾节点,并生成新节点,将尾节点指针域的原指向设置为新节点;在插入链表中间时,首先通过循环找到要插入的位置节点,然后生成新节点,并将新节点指针域的原指向设置为下一个节点,将前一个节点的指针域设置为新节点。
3.链表的删除链表的删除操作主要包括删除头节点、删除尾节点和删除中间节点。
在删除头节点时,首先通过free函数释放头节点的内存空间,然后将链表的头节点指针指向第二个节点;在删除尾节点时,首先通过循环找到倒数第二个节点,并将倒数第二个节点的指针域置空,最后通过free函数释放尾节点的内存空间;在删除中间节点时,首先通过循环找到要删除的节点的前一个节点,然后将前一个节点的指针域指向要删除节点的下一个节点,最后通过free函数释放要删除节点的内存空间。
4.链表的查询链表的查询操作主要包括按位置查询和按值查询。
在按位置查询时,通过循环找到指定位置的节点,然后返回节点的数据值;在按值查询时,通过循环比较节点的数据值与指定值,找到匹配的节点,并返回该节点的位置。
二、递归算法的应用递归算法是一种函数自己调用自己的算法设计思想,具有简洁、清晰的特点。
本次实验主要应用递归算法解决实际问题,包括斐波那契数列的求解和二叉树的遍历。
数据结构与算法实验报告实验目的:本次实验主要目的是掌握数据结构与算法的基本概念和实际应用。
通过设计和实现特定的数据结构和算法,加深对其原理和应用的理解,培养分析和解决实际问题的能力。
实验内容:本次实验包括以下几个部分:1\实验环境和工具介绍在本部分,将介绍实验所使用的开发环境和工具,包括操作系统、编程语言、集成开发环境等。
2\实验设计和思路本部分将详细介绍实验的设计思路、算法的选择和实现方式。
具体包括数据结构的选择、算法的设计原理、时间和空间复杂度分析等。
3\实验步骤和代码实现在本部分,将详细列出实验的具体步骤和算法的实现代码。
包括数据结构的定义和操作、算法的实现和测试数据的等。
4\实验结果和分析在本部分,将展示实验的运行结果,并对实验结果进行分析和讨论。
包括实际运行时间、空间占用、算法的优缺点等方面的讨论。
5\实验总结和思考在本部分,将对整个实验进行总结和思考。
包括实验过程中遇到的问题和解决方法,对实验结果的评价,以及对进一步的研究方向的思考等内容。
附件:本文档附带以下附件:1\源代码:包括数据结构的定义和操作,算法的实现等。
2\测试数据:用于验证算法实现的测试数据。
3\实验结果截图:包括算法运行结果、时间和空间占用等方面的截图。
法律名词及注释:1\数据结构:在计算机科学中,数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。
2\算法:算法是解决问题的一系列清晰而简明的指令,是计算或操作的一种良定义的规程。
3\时间复杂度:时间复杂度是度量算法运行时间长短的一个表达式,用大O符号表示。
4\空间复杂度:空间复杂度是度量算法运行过程中所需的存储空间的一个表达式,用大O符号表示。
结语:本文档详细介绍了数据结构与算法实验的设计思路、步骤和实现代码,并对实验结果进行了分析和讨论。
实验过程中,我们掌握了数据结构与算法的基本概念和实际应用,提高了问题解决能力和编程实践能力。
算法与及数据结构实验报告算法与数据结构实验报告一、实验目的本次算法与数据结构实验的主要目的是通过实际操作和编程实现,深入理解和掌握常见算法和数据结构的基本原理、特性和应用,提高我们解决实际问题的能力和编程技巧。
二、实验环境本次实验使用的编程语言为 Python,开发环境为 PyCharm。
同时,为了进行算法性能的分析和比较,使用了 Python 的 time 模块来计算程序的运行时间。
三、实验内容1、线性表的实现与操作顺序表的实现:使用数组来实现顺序表,并实现了插入、删除、查找等基本操作。
链表的实现:通过创建节点类来实现链表,包括单向链表和双向链表,并完成了相应的操作。
2、栈和队列的应用栈的实现与应用:用数组或链表实现栈结构,解决了表达式求值、括号匹配等问题。
队列的实现与应用:实现了顺序队列和循环队列,用于模拟排队系统等场景。
3、树结构的探索二叉树的创建与遍历:实现了二叉树的先序、中序和后序遍历算法,并对其时间复杂度进行了分析。
二叉搜索树的操作:构建二叉搜索树,实现了插入、删除、查找等操作。
4、图的表示与遍历邻接矩阵和邻接表表示图:分别用邻接矩阵和邻接表来存储图的结构,并对两种表示方法的优缺点进行了比较。
图的深度优先遍历和广度优先遍历:实现了两种遍历算法,并应用于解决路径查找等问题。
5、排序算法的比较插入排序、冒泡排序、选择排序:实现了这三种简单排序算法,并对不同规模的数据进行排序,比较它们的性能。
快速排序、归并排序:深入理解并实现了这两种高效的排序算法,通过实验分析其在不同情况下的表现。
6、查找算法的实践顺序查找、二分查找:实现了这两种基本的查找算法,并比较它们在有序和无序数据中的查找效率。
四、实验步骤及结果分析1、线性表的实现与操作顺序表:在实现顺序表的插入操作时,如果插入位置在表的末尾或中间,需要移动后续元素以腾出空间。
删除操作同理,需要移动被删除元素后面的元素。
在查找操作中,通过遍历数组即可完成。
数据结构实训报告总结在数据结构实训中,我们学习了各种常用的数据结构及其相关算法,并通过实践应用了这些知识。
本文将对实训内容进行总结,包括学习的主要内容、实践中遇到的问题以及所得到的收获和体会。
一、学习内容概述在实训中,我们学习了线性表、栈、队列、树、图等数据结构的基本概念和常用算法。
通过理论学习和实践编程,我们对这些数据结构的特点、操作和应用有了更深入的了解。
同时,我们还学习了算法的时间复杂度和空间复杂度的分析方法,能够对算法的效率进行评估和优化。
二、实践中遇到的问题及解决方案在实训过程中,我们遇到了一些问题,如如何选择合适的数据结构、如何设计高效的算法等。
针对这些问题,我们采取了以下解决方案:1. 选择合适的数据结构:根据问题的需求和特点,我们仔细分析了不同数据结构的优缺点,并选择了最合适的数据结构来解决问题。
例如,对于需要频繁插入和删除元素的场景,我们选择了链表作为数据结构。
2. 设计高效的算法:在解决问题时,我们注意算法的时间复杂度和空间复杂度,尽量选择高效的算法。
例如,在排序算法中,我们选择了快速排序算法,其时间复杂度为O(nlogn),比冒泡排序的O(n^2)要高效。
三、收获和体会通过这次实训,我们收获了以下几个方面的经验和体会:1. 理论联系实际:通过实践应用数据结构和算法,我们更加深入地理解了它们的实际应用。
我们发现,数据结构和算法是解决实际问题的重要工具,能够提高程序的效率和性能。
2. 团队合作能力:在实训过程中,我们需要与团队成员合作完成编程任务。
通过团队合作,我们学会了有效地分工合作、沟通协调,并通过相互学习和讨论提高了自己的编程能力。
3. 解决问题的能力:在实践中,我们遇到了各种问题,如代码bug、算法优化等。
通过不断思考和尝试,我们学会了独立解决问题的能力,并提高了自己的编程思维和调试技巧。
4. 抽象思维能力:在设计数据结构和算法时,我们需要进行抽象思维,将问题抽象为适合的数据结构和算法。
数据结构实训总结1. 引言数据结构是计算机科学中最基础、最重要的课程之一。
通过实训课程的学习和实践,我对数据结构的理论知识有了更深入的了解,并且在实际项目中应用这些知识,提高了我的编程能力和问题解决能力。
本文将总结我在数据结构实训中的学习经验和收获。
2. 实训内容2.1 实训目标本次数据结构实训的目标是通过实践掌握常见的数据结构,包括线性表、栈、队列、树和图等,并能够灵便运用这些数据结构解决实际问题。
2.2 实训任务在实训过程中,我们完成为了以下任务:- 实现线性表的顺序存储结构和链式存储结构,并比较它们的优缺点。
- 实现栈和队列的顺序存储结构和链式存储结构,并掌握它们的应用场景。
- 实现二叉树的链式存储结构和遍历算法,包括前序遍历、中序遍历和后序遍历。
- 实现图的邻接矩阵表示和邻接表表示,并掌握图的遍历算法,如深度优先搜索和广度优先搜索。
3. 实训经验和收获3.1 理论知识与实践结合通过实训课程,我深刻体味到理论知识与实践的结合是学习数据结构的有效途径。
在实际项目中应用数据结构,我更加理解了数据结构的本质和作用,加深了对数据结构的理解。
3.2 问题解决能力的提升在实训过程中,我们遇到了许多问题,如算法设计、数据结构选择和程序调试等。
通过解决这些问题,我提高了自己的问题解决能力和调试技巧,学会了从多个角度思量和分析问题,并找到最优的解决方案。
3.3 团队合作意识的培养在实训项目中,我们需要与同学合作完成任务,包括代码编写、测试和调试等。
通过团队合作,我学会了与他人沟通、协调和分工合作,培养了团队合作意识和能力。
4. 实训成果展示在实训过程中,我完成为了以下成果:- 实现了线性表的顺序存储结构和链式存储结构,并比较了它们的优缺点。
- 实现了栈和队列的顺序存储结构和链式存储结构,并了解了它们的应用场景。
- 实现了二叉树的链式存储结构和遍历算法,包括前序遍历、中序遍历和后序遍历。
- 实现了图的邻接矩阵表示和邻接表表示,并掌握了图的遍历算法,如深度优先搜索和广度优先搜索。
数据结构实训总结[五篇]第一篇:数据结构实训总结这次课程设计的心得体会通过实习我的收获如下1、巩固和加深了对数据结构的理解,提高综合运用本课程所学知识的能力。
2、培养了我选用参考书,查阅手册及文献资料的能力。
培养独立思考,深入研究,分析问题、解决问题的能力。
3、通过实际编译系统的分析设计、编程调试,掌握应用软件的分析方法和工程设计方法。
4、通过课程设计,培养了我严肃认真的工作作风,逐步建立正确的生产观念、经济观念和全局观念。
从刚开始得觉得很难,到最后把这个做出来,付出了很多,也得到了很多,以前总以为自己对编程的地方还不行,现在,才发现只要认真做,没有什么不可能。
编程时要认真仔细,出现错误要及时找出并改正,(其中对英语的要求也体现出来了,因为它说明错误的时候都是英语)遇到问题要去查相关的资料。
反复的调试程序,最好是多找几个同学来对你的程序进行调试并听其对你的程序的建议,在他们不知道程序怎么写的时候完全以一个用户的身份来用对你的用户界面做一些建议,正所谓当局者迷旁观者清,把各个注意的问题要想到;同时要形成自己的编写程序与调试程序的风格,从每个细节出发,不放过每个知识点,注意与理论的联系和理论与实践的差别。
另外,要注意符号的使用,注意对字符处理,特别是对指针的使用很容易出错且调试过程是不会报错的,那么我们要始终注意指针的初始化不管它怎么用以免不必要麻烦。
通过近两周的学习与实践,体验了一下离开课堂的学习,也可以理解为一次实践与理论的很好的连接。
特别是本组所做的题目都是课堂上所讲的例子,在实行之的过程中并不是那么容易事让人有一种纸上谈兵的体会,正所谓纸上得来终觉浅绝知此事要躬行。
实训过程中让我们对懂得的知识做了进一步深入了解,让我们的理解与记忆更深刻,对不懂的知识与不清楚的东西也做了一定的了解,也形成了一定的个人做事风格。
通过这次课程设计,让我对一个程序的数据结构有更全面更进一步的认识,根据不同的需求,采用不同的数据存储方式,不一定要用栈,二叉树等高级类型,有时用基本的一维数组,只要运用得当,也能达到相同的效果,甚至更佳,就如这次的课程设计,通过用for的多重循环,舍弃多余的循环,提高了程序的运行效率。
数据结构与算法实验报告数据结构与算法实验报告一、实验目的本实验旨在通过实践的方式,加深对数据结构与算法的理解与应用,并能够独立设计和实现常见的数据结构和算法。
二、实验要求1·设计并实现以下数据结构与算法:(按需列出具体数据结构与算法)2·进行性能测试,分析并总结测试结果。
3·撰写实验报告,完整记录实验过程与结果,并进行适当的分析与总结。
三、实验环境(列出实验所需环境,包括操作系统、编程语言及开发环境等)四、实验过程与方法4·1 数据结构设计与实现(首先介绍每个数据结构的功能与特点,然后给出设计思路和实现方法,包括数据结构的定义、操作方法和算法等)4·2 算法设计与实现(首先介绍每个算法的功能与特点,然后给出设计思路和实现方法,包括算法的定义、输入输出格式、算法流程图等)五、实验结果与分析5·1 数据结构性能测试结果(列出数据结构的测试用例及其输入输出,记录测试结果,包括运行时间、空间占用等方面的数据,并进行适当的分析与总结)5·2 算法性能测试结果(列出算法的测试用例及其输入输出,记录测试结果,包括运行时间、空间占用等方面的数据,并进行适当的分析与总结)六、实验总结6·1 实验成果(总结实验所达到的目标,列出已实现的数据结构和算法)6·2 实验心得(记录实验过程中的收获和体会,包括困难与解决方法、感悟和改进方向等)附件:1·实验源码(附上实验所使用的源代码文件,以供参考)2·实验数据(附上实验所用的测试数据文件或数据表格等)法律名词及注释:(列出文档中涉及的法律名词及其注释,以确保读者对相关法律法规的理解)。
XXXX学院课程实训报告课程名:数据结构与算法实训学号:姓名:班级:指导老师:时间:1.设计任务、要求及所用软件环境(1)设计任务:成绩管理:设计一个程序进行学生成绩管理。
假设对某个班的学生5门课程的学习成绩进行管理,实现以下功能:(1)求每门课程的平均成绩;(2)输出每门课程成绩优秀(>=90分)的学生名单及成绩;(3)输出只有一门课程不及格的学生名单及每门成绩;(4)对5门课程中可以按照任一门课程的成绩进行排序。
(2)设计要求:1)学生成绩采用链表存储方式;2)学生人数和学生的成绩从键盘输入;3)排序方法可以任选一种。
(3)所用软件环境:Microsoft Visual C++ 6.0 (二级C语言专用版)2.问题的模型化描述以及求解问题的算法简要描述通过开发一个学生成绩管理信息系统,掌握与数组有关的算法、函数的调用、结构体类型变量的定义和使用,提高实际运用能力。
开始进入登录界面,根据输入的操作选项,可分别进行各项操作:可完成学生成绩信息的输入,求平均成绩,查询每门课程成绩优秀(>=90分)的学生名单及成绩,查询只有一门课程不及格的学生名单及每门成绩,对5门课程中可以按照任一门课程的成绩进行排序等功能。
3.所选择的存储结构及基本运算、设计的模块构成、各模块的简要说明、流程图、调用关系表。
用Microsoft Visual C++ 6.0 (二级C语言专用版)编写,完成学生成绩的链表存储,任意学生成绩的插入、查询、排序。
(1)输入形式和输入范围:建立成绩管理时,需要指定元素个数和每个元素的值,然后按元素的顺序建立一个链式成绩管理系统;排序时,需要确定排序方法;查找操作时需要元素的范围;在所有输入中,元素的值都是整数。
(2)输出的形式:在所有操作中都显示操作是否正确以及操作后链表的内容。
设计的模块构成:4.程序组成基本操作及流程图:(1)结构图:(2)函数average()的流程图:(3)函数Excellent()的流程图:所设计软件的组成(程序文件)及使用说明。
main():主函数average():求课程的平均成绩Excellent():查找所有个人平均分超过90分的学生,并将其学号输出Fail():查找有成绩不及格的学生,并输出其信息Sort():对班级学生按某门课程成绩排名各函数间关系如下:average()Excellent()main() Fail()Sort()5.程序清单程序清单:#include"stdio.h"#include"stdlib.h"#define NUM 5 //课程数#define NULL 0typedef struct node //学生的结构体定义{int id; //学号char name[16]; //姓名int subject[NUM]; //课程数据组float aver; //学生个人课程平均分struct node *next;}student;student *head = NULL; //head为学生连表的头指针int n;void Sort() //对班级学生按某门课程成绩排名{int j; //课程序号student *p1, *p2, *p3;printf("请输入需要排序的课程序号(1~5):\n");scanf("%d",&j);//由大到小排序,排序方法采用冒泡排序法if(head != NULL){p1=p2=p3=head;while(p2->next!=NULL){p1=p2=p3=head;p2=p1->next; //将p2移到p1下一个节点//如果前一个节点大于下一个节点,p1和p2都往下移一个节点,p3移到p1原本指着的节点while(p2->next!=NULL && p1->subject[j-1] >= p2->subject[j-1]){p3=p1;p1=p2;p2=p1->next;}//当出现后面一个节点大于前一个节点的时候,调整节点位置if(p1->subject[j-1] < p2->subject[j-1]){p1->next = p2->next; //p1与p2的下一个节点连接p2->next = p1; //p2与p1连接if(p3!=p1)p3->next=p2; //p3与p2连接if(p1 == head)head = p2; //当p1是头节点,那么头节点变成p1}}printf("班级学生课程%d的排序是:\n",j);p1 = head;while(p1) //输出按课程j-1成绩排名的所有学生姓名和课程j-1的成绩{printf("姓名:%s 成绩:%d\n",p1->name,p1->subject[j-1]);p1=p1->next;}}else{printf("没有学生信息!\n\n");return;}}void average() //求课程的平均成绩{int i,j;float sum,aver;student *p;printf("课程平均成绩:\n");printf("#######课程#######课程平均#######\n\n");for(i=0;i<NUM;i++) //统计课程的平均成绩{j=0;sum=0;p = head;while(p){sum=sum+p->subject[i];p=p->next;j++;}aver=sum/j;printf(" 课程 %d %.2f\n",i+1,aver);}printf("\n");printf("#################################\n\n");}void Fail() //查找有成绩不及格的学生,并输出其信息{int i;student *p;p=head;printf("没有通过的结果如下:\n");printf("#####学号#####姓名####课程1####2####3#####4#####5####平均分###\n");while(p){i=0; //从课程1开始查找while(i<NUM){if(p->subject[i] < 60) //如果不及格,则输出学生所有信息{printf("%8d %10s", p->id, p->name);for(i=0; i<NUM; i++)printf("%6d",p->subject[i]);printf("%8.2f\n",p->aver);break;//学生只要有1门课程不及格就查找成功,跳出循环 }elsei++;//查找下一门课程}p=p->next;//查找下一个结点}printf("##############################################################\n\n");}void Excellent()//查找所有个人平均分超过90分的学生,并将其学号输出{student *p;bool k = false;p = head;while(p)//从第1个结点开始查找{if(p->aver >= 90.0){printf("\n");printf("成绩优秀的学生学号为%d\n",p->id);p=p->next;k = true;}elsep=p->next;}if(!k)printf("没有平均分超过90分的学生\n");}void main(){student *p, *q;int i,j,k,flag=1;float sum;head =(student *)malloc(sizeof(student));//生成一个头结点printf("请输入学生人数!\n");scanf("%d",&n);q=head;//q指向第一个结点for(i=0;i<n;i++) //输入n个学生的姓名、学号、所有课程的成绩{p=q;printf("输入学生%d的学号:",i+1);scanf("%d",&p->id);//输入学号printf("输入学生%d的姓名:",i+1);scanf("%s",p->name);//输入姓名printf("\n");printf("请输入学生%d的5门成绩\n",i+1);for(j=0;j<NUM;j++) //输入一个学生的5门课程成绩{printf("第%d科成绩:",j+1);scanf("%d",&p->subject[j]);}q=(student *)malloc(sizeof(student));q->next=NULL;p->next=q;printf("\n\n");}p=head;for(i=0;i<n-1;i++) //查找链表最后的空结点p=p->next;q=p->next;free(q);//将空结点释放掉p->next=NULL;p=head;while(p){sum=0.0;for(j=0;j<NUM;j++)sum = sum + p->subject[j];p->aver = sum/NUM;p = p->next;}printf("\n\n");while(flag){printf("########################################################\n");printf("1-----求每门课程的平均成绩\n");printf("2-----输出有课程不及格的学生情况\n");printf("3-----输出个人平均分超过90分的学生学号\n");printf("4-----所有学生对制定课程排名\n");printf("5-----退出\n");printf("########################################################\n");printf("\n\n");printf("请选择(1-5): ");scanf("%d",&k);switch(k){case 1: average();break;case 2: Fail();break;case 3: Excellent();break;case 4: Sort();break;case 5: flag=0;break;default:printf("该选项不存在!");}} }6.运行结果:7.设计总结和体会:。