数据结构实验指导
- 格式:doc
- 大小:82.00 KB
- 文档页数:17
《数据结构》实验指导书实验一、顺序表实验目的:熟悉顺序表的逻辑特性、存储表示方法和顺序表的基本操作。
实验要求:了解并熟悉顺序表的逻辑特性、存储表示方法和顺序表的基本操作的实现和应用。
实验内容:编写程序实现下列的要求:(1) 设数据元素为整数,实现这样的线性表的顺序存储表示。
(2) 键盘输入10个数据元素,利用顺序表的基本操作,建立该表。
(3) 利用顺序表的基本操作,找出表中的最大的和最小的数据元素(用于比较的数据元素为整数)。
(4) * 若数据元素为学生成绩(含姓名、成绩等字段),重新编程,实现上面的要求。
要求尽可能少地修改前面的程序来得到新程序。
(这里用于比较的字段为分数)练习及思考题:(1)顺序表的操作上有什么特点?(2)不固定数据元素的个数,而通过特殊数据来标记输入数据的结束,实现这样的输入操作。
实验二、链表实验目的:熟悉链式表的逻辑特性、存储表示方法的特点和链式表的基本操作。
实验要求:了解并熟悉链式表的逻辑特性、存储表示方法和链式表的基本操作的实现和应用。
实验内容:编写程序实现下列的要求:(1) 设学生成绩表中的数据元素为学生成绩(含姓名、成绩字段),实现这样的线性表的链式存储表示。
(2) 键盘输入若干个数据元素(用特殊数据来标记输入数据的结束),利用链表的基本操作(前插或后插算法),建立学生成绩单链表。
(3) 键盘输入关键字值x,打印出表中所有关键字值<=x的结点数据。
(用于比较的关键字字段为分数)。
(4) 输入关键字值x,删除表中所有关键字值<=x的结点。
(用于比较的关键字字段为分数)。
练习及思考题:(1)不同类型的数据元素所对应的链式表在类型定义和操作实现上有什么异同?(2)有头结点的链式表,有什么特点?实验三、栈的应用实验目的:熟悉栈的逻辑特性、存储表示方法和栈的基本操作。
实验要求:了解并熟悉栈的逻辑特性、顺序和链式存储表示方法和栈的基本操作的实现和应用。
实验内容:(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、图的存储结构实现邻接矩阵和邻接表两种图的存储结构。
数据结构实验指导程序调试的方法对程序设计者来说,不仅要会编写程序,还要上机调试通过。
初学者的程序往往不是一次就能顺利通过,即使一个有经验的程序员也常会出现某些疏忽。
上机的目的不仅是验证程序的正确性,还要掌握程序调试的技术,提高动手能力。
程序的调试具有很强的技术性和经验性,其效率高低在很大的程度上依赖于程序设计者的经验。
有经验的人很快就能发现错误,而有的人在计算机显示出错误信息并告诉他哪一行有错之后还找不出错误所在。
所以初学者调通一个程序往往比编写程序花的时间还多。
调试程序的经验固然可以借鉴他人的,但更重要的是靠实践来积累。
调试程序是程序设计课程的一个重要环节。
上机之前要做好程序调试的准备工作。
程序调试的准备工作包括熟悉程序的运行环境和各个程序设计阶段为程序调试所做的准备。
上机前要先熟悉程序运行的环境一个C语言源程序总是在一定的硬件和软件环境支持下进行编辑、编译、连接和运行的,而这其中的每一步都直接影响程序调试的效率。
所以初学者必须了解所使用的计算机系统的基本操作方法,学会使用该系统,了解在该系统上如何编辑、编译、连接和运行一个C语言程序。
上机时需要输入和修改程序,不同的操作系统提供的编辑程序是不同的。
DOS操作系统提供了全屏幕编辑程序Edit,UNIX操作系统提供了屏幕编辑程序Vi,还有一些集成环境提供了编辑功能,如果对编辑程序的基本功能和操作不熟悉,就很难使用好这个工具,那么在输入和修改程序中就会遇到很多困难,往往越该越乱,甚至因为不存盘的误操作而使修改、调试的工作前功尽弃。
更有甚者,由于初学者对操作系统或编辑程序的操作命令不熟悉而误删了一个正在调试或已经调试好的程序,就不得不重新输入、调试,浪费了许多时间。
所以在上机调试之前,必须认真了解程序运行的环境,了解常用的一些操作命令,这样上机调试程序时效率就会大大提高。
程序设计过程中要为程序调试做好准备1.采用模块化、结构化方法设计程序。
所谓模块化就是将一个大任务分解成若干个较小的部分,每一部分承担一定的功能,称为“功能模块”。
数据结构实验指导书数据结构实验指导书目录数据结构实验指导书 (1)目录 (1)实验指导书概述 (2)上机实验题目 (3)实验一 C语言相关知识复习 (3)一、实验目的 (3)二、实验内容 (3)实验二单链表的插入、删除 (3)一、实验目的 (3)二、实验内容 (3)三、实现提示 (4)实验三栈及其应用 (5)一、实验目的 (5)二、实验内容 (5)实验四二叉树的递归算法 (6)一、实验目的 (6)二、实验内容 (6)实验五图的遍历 (7)一、实验目的 (7)二、实验内容 (7)实验六有序表的查找 (7)一、实验目的 (7)二、实验内容 (7)实验七哈希表 (7)一、实验目的 (7)二、实验内容 (7)实验八内部排序算法的应用 (8)一、实验目的 (8)二、实验内容 (8)实验指导书概述“数据结构”是计算机专业一门重要的专业技术基础课程,是一门关键性核心课程。
本课程系统地介绍了软件设计中常用的数据结构以及相应的存储结构和实现算法,介绍了多种常用的查找和排序技术,并对其进行了性能分析和比较,内容非常丰富。
本课程的学习将为后续课程的学习以及软件设计水平的提高打下良好的基础。
由于以下原因,使得掌握这门课程具有较大难度:∙内容多,时间短,给学习带来困难;∙贯穿全书的动态链表存储结构和递归技术是学习中的重点和难点;∙隐含在各部分的技术和方法丰富,也是学习的重点和难点;∙先修课程中所介绍的专业性知识不多,加大了学习难度。
由于数据结构课程的技术性与实践性,《数据结构课程实验》的设置十分必要。
为了帮助学生更好地学习本课程,理解和掌握算法设计所需的技术,为整个专业学习打好基础,要求运用所学知识,上机解决一些典型问题,通过分析、设计、编码、调试等各环节的训练,使学生深刻理解、牢固掌握所用到的一些技术。
上机实践是对学生的一种全面综合训练,是与课堂听讲、自学和练习相辅相成的必不可少的一个教学环节。
通过上机实践,使学生在可能短的时间内对数据结构知识的实践和应用有一个比较全面和系统的认识,达到理论与实践相结合的目的。
《数据结构》实验指导书软件学院2011年9月概述实习目的和要求《数据结构》在计算机科学中是一门实践性较强的专业基础课, 上机实习是对学生的一种全面综合训练, 是与课堂听讲、自习和练习相辅相成的必不可少的一个教学环节。
实习着眼于原理与应用的结合, 使学生学会把学到的知识用于解决实际问题, 起到深化理解和灵活掌握教学内容的目的。
同时, 通过本课程的上机实习, 使学生在程序设计方法及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。
实习包括的步骤1. 简要描述题目要求, 对问题的描述应避开算法及所涉及的数据类型, 只是对所需完成的任务做出明确的陈述, 例如输入数据的类型、值的范围以及输入的形式, 输出数据的类型、值的范围以及输出的形式。
2. 选定数据结构, 写出算法, 根据自顶向下发展算法的方法, 首先描述算法的基本思想, 然后进行算法细化, 再对所设计的算法的时间复杂性和空间复杂性进行简单分析。
3. 准备好上机所需的程序, 选定一种程序设计语言(如C 语言), 手工编好上机程序, 并进行反复检查, 使程序中的逻辑错误和语法错误减少到最低程度。
对程序中有疑问的地方, 应做出标记, 以便在上机时给予注意。
4.上机输入和调试程序, 在调试程序过程中除了系统的问题以外, 一般应自己独立解决。
在程序调试通过后, 打印输出程序清单和运行结果。
5.上机结束后, 总结和整理实习报告。
实习报告的内容1.简述题目要解决的问题是什么, 并说明输入和输出数据的形式。
2.简述存储结构和算法的基本思想。
3.列出调试通过的源程序。
4.列出上面程序对应的运行结果。
分析程序的优缺点、时空性能以及改进思想, 写出心得体会。
实验一线性表一. 目的与要求本次实习的主要目的是为了使学生熟练掌握线性表的基本操作在顺序存储结构和链式存储结构上的实现, 提高分析和解决问题的能力。
要求仔细阅读并理解下列例题, 上机通过, 并观察其结果, 然后独立完成后面的实习题。
《数据结构》实验指导《数据结构》C语言版实验指导目录《数据结构》上机实验的目的和要求 (1)实验一顺序结构线性表的实现 (3)实验二单链表的插入和删除 (16)实验三栈的实现 (24)实验四二叉树操作实现 (30)实验五哈夫曼树的建立与编码实现 (39)实验六图的遍历操作 (50)实验七排序 (67)实验八查找 (83)《数据结构》课程设计 (95)《数据结构》上机实验的目的和要求通过上机实验加深对课程内容的理解,增加感性认识,提高软件设计、编写及调试程序的能力。
要求所编的程序能正确运行,并提交实验报告。
实验报告的基本要求为:1、需求分析:陈述程序设计的任务,强调程序要做什么,明确规定:(1)输入的形式和输出值的范围;(2)输出的形式;(3)程序所能达到的功能;(4)测试数据:包括正确的输入输出结果和错误的输入及输出结果。
2、概要设计:说明用到的数据结构定义、主程序的流程及各程序模块之间的调用关系。
3、详细设计:提交带注释的源程序或者用伪代码写出每个操作所涉及的算法。
4、调试分析:(1)调试过程中所遇到的问题及解决方法;(2)算法的时空分析;(3)经验与体会。
5、用户使用说明:说明如何使用你的程序,详细列出每一步操作步骤。
6、测试结果:列出对于给定的输入所产生的输出结果。
若有可能,测试随输入规模的增长所用算法的实际运行时间的变化。
实验一顺序结构线性表的实现一、目的:掌握顺序表的表示方法,存储结构及其基本操作的实现。
二、要求:建立一顺序表,实现其基本操作。
三、示例程序:说明:一个完整的程序是由输入,处理,输出三部分组成的,每个部分还可以分为若干小部分,如输入,又可以分为声明,初始化变量,接收数据,预处理数据等。
书上列出的算法是解决问题的基本思路,也可以是解决问题的处理过程,并未给出详细的输入与输出,这一部分需要在练习过程中加入,在解决实际问题时,还需要做灵活的处理。
C语言本身有自身的特点,其基本思想是与机器的指令码相关的。
数据结构实验指导书实验一线性表[实验目的]1.了解顺序表的结构特点及有关概念,掌握顺序表建立、插入、删除的基本操作算法。
2.了解单链表的结构特点及有关概念,掌握单链表建立、插入、删除的基本操作算法。
[实验内容]1.顺序表的实践。
1)建立4个元素的顺序表list[]={2,3,4,5},实现顺序表建立的基本操作。
2)在list[]={2,3,4,5}的元素4和5之间插入一个元素9,实现顺序表插入的基本操作。
3)在list[]={2,3,4,9,5}中删除指定位置(i=3)上的元素9,实现顺序表的删除的基本操作。
2.单链表的实践。
1)建立一个包括头结点和3个结点的(4,2,1)的单链表,实现单链表建立的基本操作。
2)在已建好的单链表中的指定位置(x=2)插入一个结点3,实现单链表插入的基本操作。
3)在一个包括头结点和4个结点的(4,2,3,1)的单链表的指定位置删除一个结点,实现单链表删除的基本操作。
[实验要点及说明]线性表(linear list)是n(n≥0)个数据元素a1,a2,…a n组成的有限序列。
其中n 称为数据元素的个数或线性表的长度,当n=0时称为空表,n>0时称为非空表。
通常将非空的线性表记为(a1,a2,…,a n),其中的数据元素a i(1≤i≤n)是一个抽象的符号,a i是第i个数据元素,称i为数据元素a i在线性表中的位置。
其具体含义在不同情况下是不同的,即它的数据类型可以根据具体情况而定,本书中,我们将它的类型设定为elemtype,表示某一种具体的已知数据类型。
顺序表也称为线性表的顺序存储结构。
其存储方式为:在内存中用一组地址连续的存储单元依次存储线性表的数据元素,但该连续存储空间的大小要大于或等于顺序表的长度。
一般让线性表中第一个元素存放在连续存储空间第一个位置,第二个元素紧跟着第一个之后,其余依此类推。
可定义顺序表如下:#define maxnumelemtype list[maxnum];int num=-1;线性表的链式存贮结构,也称为链表。
引言概述正文内容
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.以带头结点的单链表作为存储结构,设计一个将单链表原地逆置的算法。
2.以带头结点的单链表作为存储结构,设计一个将两个有序单链表合并成一个和原次序相反的有序单链表的算法。
3.以单循环链表作为存储结构,设计一个解决约瑟夫问题的算法。
约瑟夫问题为:设编号为1,2,…,n的n个人围坐一圈,约定编号为k(1≤k≤n)的人从1开始报数,数到m 的那个人出列,他的下一位又从1开始报数,数到m的那个人出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。
三.实验提示1.单链表的结点类型定义如下:typedef struct node{int data;struct node *next;}NODE;2.建立一个带头结点单链表的函数如下;void create_linklist1(NODE **head,) /*正向建立带表头结点的单链表*/{NODE *p1, *p2;int i;*head = p2 = (NODE *) malloc ( sizeof(NODE) );scanf( “%d”, &i );while( i != 0 ){p1 = (NODE *) malloc ( sizeof(NODE) );p1->data = i;p2->next = p1;p2 = p1;scanf( “%d”, &i );}p2->next = NULL;}3.建立一个不带头结点非空单循环链表的函数如下:NODE *create_linklist2( ) /*逆向建立不带表头结点的单循环链表*/ {NODE *head, *rear, *p;int i;head = rear = (NODE *) malloc ( sizeof(NODE) );scanf( “%d”, &rear->data );scanf( “%d”, &i );while( i != 0 ){p = (NODE *) malloc ( sizeof(NODE) );p->data = i;p->next = head;head = p;scanf( “%d”, &i );}rear->next = head;return( head );}实验二栈和队列及其应用一.实验目的和要求要求学生掌握栈和队列的基本操作及其实现算法,比较它们的相同点和不同点。
能以栈和队列的基本操作为基础,解决一些实际的应用问题。
(2和3中选做一题)二.实验内容1.设计算法,将一个非负十进制整数转换成一个八进制数,分别用递归和非递归来实现。
2.理解算术表达式求值的基本思想,能将一个以字符序列形式的、以数值型常量作为操作数的中缀表达式转换成字符序列形式的后缀表达式,并能根据后缀表达式求值,以完成只含算术四则运算的表达式计算。
3.模拟停车场管理的问题。
设停车场只有一个可停车场内的狭长通道,且只有一个大门可供汽车进出。
汽车在停车场内按车辆到达的先后次序依次排列,若停车场内已经停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦停车场内有车开走,则排在便道上的第一辆车即可进入停车场;当停车场内的某辆车要离开时,由于停车场是一个狭长通道,在它之后开入的车辆必须先退出停车场为它让路,待该辆车开出大门后,为它让路的车辆再按原来的次序进入停车场。
在这里假设汽车不能在从便道上开走。
试设计一个停车场管理程序。
三.实验提示1.数制转换的非递归算法需要用一个栈来实现。
2.中缀表达式转换成后缀表达式需要用一个运算符栈来实现,其算法思想和具体实现算法如下:算法思想:a )自左至右扫描中缀表达式;b )遇到操作数直接输出;c )遇到运算符则将该运算符与栈顶运算符作比较:若该运算符的优先权高于栈顶运算符,则该运算符入栈;若该运算符的优先权不高于栈顶运算符,则栈顶运算符出栈输出;d )重复上述过程,直至中缀表达式处理完毕。
为方便起见,我们在每个操作数后面加上逗号,在中缀表达式结束加上‘#’。
例:中缀表达式为(15,+3,)/(2,*(6,-3,))#转换成的后缀表达式为15,3,+2,6,3,- * / #具体算法:#define maxsize 100#define true 1#define false 0typedef struct opstack{char opelem[ maxsize ] ;int optop;} Opstack ;void infixtopostfix ( char e[ ] , char a[ ] )/* 把e中的中缀表达式转换成后缀表达式,并存入a中*/ {Opstack optr ;int i, j, tag ;char w ;i = j = 0;initstack ( &optr ) ;while ( e[i] != ‘#’){switch ( e[i] ){case …0‟:case …1‟:case …2‟:case …3‟:case …4‟:case …5‟:case …6‟:case …7‟:case …8‟:case …9‟:while ( e[i] != …,‟ ){a[j] = e[i] ;i++ ;j++ ;}a[j] = …,‟ ;数据结构j++ ;break ;case …(‟:push ( &optr, e[i] ) ;break ;case …)‟:gettop ( optr, &w ) ;pop ( &optr ) ;while ( w != …(‟ ){a[j] = w ;j++ ;gettop ( optr, &w ) ;pop ( &optr ) ;}break ;case …+‟:case …-‟:if ( !emptys ( optr )){gettop (optr, &w ) ;tag = false ;while ( w != …(‟ && !tag ){a[j] = w ;j++ ;pop ( &optr ) ;if ( emptys ( optr ))tag = true ;elsegettop ( optr, &w ) ;}}push ( &optr, e[i] ) ;break ;case …*‟:case …/‟:if ( !emptys ( optr )){gettop (optr, &w ) ;tag = false ;while ( (w == …*‟ || w == …/‟ ) && !tag ){a[j] = w ;j++ ;pop ( &optr ) ;if ( emptys ( optr ))tag = true ;elsegettop ( optr, &w ) ;}}push ( &optr, e[i] ) ;break ;} /* of switch */i++ ;} /* of while */while ( !emptys ( optr )){gettop ( optr, &w ) ;pop ( &optr ) ;a[j] = w ;j++ ;}a[j] = …#‟ ;}3.根据后缀表达式求值需要用一个操作数栈来实现,栈元素为数值类型(整型或者实型),入栈时需要把数字字符串转换成数值。
4.在停车场管理的问题中,可以把停车场内的狭长通道设计为一个栈,门外的便道设计为一个队列。
可以再设计另外一个栈,车辆要离开时,将从停车场退出为它让路的汽车放入该栈中。
实验三数组和串一.实验目的和要求要求学生掌握数组和串的基本存储结构和基本操作,能运用链式存储方法实现一些基本的串运算和矩阵的加法运算。
二.实验内容1.用单链表表示一个串,并在用单链表表示的串上实现的串的插入和删除运算。
2.建立一个表示矩阵的十字链表。
3.在用十字链表表示的矩阵上实现稀疏矩阵的加法运算。
三.实验提示1.串的表示可以用带头结点的单链表,每个结点只存放一个字符。
2.串的插入算法可以用函数StrInsert ( NODE *s; int i; NODE *t )实现。
其中s和t都是用带头结点的单链表表示的串,i为插入位置。
操作结果是将串t插入到s的第i个字符位置上,s的串值发生了改变。
3.串的删除算法可以用函数StrDelete ( NODE *s; int i; int len )实现。
其中s是用带头结点的单链表表示的串,i为删除位置,len为被删除元素的个数。
操作结果是删除串s中从第i 个字符开始的长度为len的子串,s的串值发生了改变。
4.建立一个表示矩阵的十字链表的算法如下:#define maxsize 100typedef struct OLnode{int i, j; /* 矩阵元素的行下标和列下标*/int val; /* 矩阵元素的值,假定为整型*/struct OLnode *right, *down;/*该元素所在行表和列表的后继链域*/}OLNode;typedef struct{OLNode *rhead[ maxsize ], *chead[ maxsize ];/*行链表和列链表的头指针向量*/ int mu, nu, tu; /* 矩阵的行数、列数和非零元素的个数*/}CrossList;void creatematrix_OL( CrossList *M ){int m, n, t, i, j, k, e;OLNode *p, *q;Scanf( “%d,%d,%d”, &m, &n, &t );(*M).mu = m;(*M).nu = n;(*M).tu = t;for ( i = 1; i <= m; m++ )(*M).rheah[ i ] = NULL; /* 初始化行链表头指针向量,rhead[ 0 ]闲置*/for ( j = 1; j <= n; j++ )(*M).cheah[ j ] = NULL; /* 初始化列链表头指针向量,chead[ 0 ] 闲置*/for ( k = 1; k <= t; k++ ){scanf ( “%d,%d,%d”, &i, &j, &e ); /* 按任意次序输入元素的行号、列号和值*/ p = ( OLNode * ) malloc ( sizeof ( OLNode )); /* 生成结点*/p->i = i;p->j = j;p->val = e;if ( (*M).rhead[ i ] ==NULL || (*M).rhead[ i ]->j > j ){p->right = (*M).rhead[ i ];(*M).rhead[ i ] = p;}else {q = (*M).rhead[ i ];while ( q->right && q->right->j < j )q = q->right;p->right = q->right;q->right = p;} /* 完成行的插入*/if ( (*M).chead[ j ] ==NULL || (*M).chead[ j ]->i > i ){p->down = (*M).chead[ j ];(*M).chead[ j ] = p;}else {q = (*M).chead[ j ];while ( q->down && q->down->i < i )q = q->down;p->down = q->down;q->down = p;} /* 完成列的插入*/ }}5.输出十字链表中矩阵元素的算法如下:void printmatrix( CrossList M ){OLNode *p;int ii, jj;printf(“\n按矩阵形式输出:\n”);for ( ii = 1; ii <= M.mu; ii++ ){ p = M.rhead[ ii ];for ( jj = 1; jj <= M.nu; jj++ )if ( p != NULL && p->j == jj ){ printf ( “%5d”, p->val );p = p->right;}elseprintf ( “%5d”, 0 );printf(“\n”);}}实验四树和二叉树及其应用一.实验目的和要求要求学生掌握树与二叉树的基本存储结构和基本操作,特别要掌握树以二叉链表作为存储结构二叉树的非递归遍历算法,并能运用遍历算法解决一些实际问题。