数据结构第三次作业
计算机第三次作业

计算机第三次作业在当今数字化的时代,计算机已经成为我们生活和工作中不可或缺的一部分。
对于学习计算机知识的我们来说,每一次的作业都是一次深入探索和巩固所学的机会。
这次的第三次作业,同样让我收获颇丰。
这次作业涵盖了多个方面的计算机知识。
其中,编程部分要求我们运用所学的编程语言解决一些实际的问题。
这不仅考验了我们对语法和逻辑的掌握,更要求我们具备将问题转化为可执行代码的能力。
在解决编程问题的过程中,我深刻体会到了算法的重要性。
一个好的算法能够极大地提高程序的运行效率,减少资源的消耗。
比如说,在处理大量数据时,选择合适的排序算法就能节省大量的时间。
冒泡排序、快速排序、归并排序等,它们各有特点,适用于不同的场景。
我们需要根据具体的问题需求,选择最适合的算法。
除了编程,这次作业还涉及到了计算机网络的知识。
我们需要了解网络的拓扑结构、IP 地址的分配与管理、以及各种网络协议的工作原理。
计算机网络就像是一张无形的大网,将世界各地的计算机连接在一起,实现信息的快速传递和资源的共享。
而我们要做的,就是理解这张网的构成和运作方式,以便更好地利用它。
在学习计算机网络的过程中,我对TCP/IP 协议有了更深入的理解。
TCP 协议保证了数据传输的可靠性,而 IP 协议则负责将数据从源地址传输到目标地址。
这两个协议相互配合,使得我们能够在网络上流畅地进行通信,无论是浏览网页、观看视频,还是进行在线游戏。
另外,操作系统也是本次作业的重要内容之一。
操作系统是计算机系统的核心,它管理着计算机的硬件资源和软件资源,为用户提供了一个方便、高效的工作环境。
我们需要了解进程管理、内存管理、文件系统等方面的知识。
在进程管理中,我们要学会如何合理地分配 CPU 时间,让多个进程能够并发执行,提高系统的利用率。
内存管理则涉及到如何有效地分配和回收内存空间,避免内存泄漏和碎片化。
而文件系统则负责组织和管理计算机中的文件和目录,让我们能够方便地存储和访问数据。
数据结构第三次实验报告概况

2013-2014 学年第 1 学期 任课老师: 刘安丰 课程名称 实验名称 实验环境 C++ 实验目的和内容要求 数据结构 班级 学号 实验时间 姓名 12 月 5 号
实验三
图的操作算法
作算法
实现图的常用操作算法:包括建立图的存储结构、深度优先搜索和广度优先搜索,求图 的最小生成树、拓扑排序、最短路径等。 二、实验目的 1.掌握图的基本存储方法。 2.掌握有关图的操作算法并用高级语言实现。 3.熟练掌握图的两种搜索路径的遍历方法。 4. 掌握图的有关应用。
G.arcs[j][i].adj = G.arcs[i][j].adj; } return OK; } int LocateVex(MGraph G,char ch) //确定节点 ch 在图 G.vexs 中的位置 { int a ; for(int i=0; i<G.vexnum; i++) { if(G.vexs[i] == ch) a=i; } return a; } //typedef struct Pnode //用于普利姆算法 //{ // char adjvex; //节点 // double lowcost; //权值 //}Pnode,Closedge[MAX_VERTEX_NUM]; //记录顶点集 U 到 V-U 的代价最小的边的辅助数组定义 void MiniSpanTree_PRIM(MGraph G,char u)//普利姆算法求最小生成树 { int i,j,k; Closedge closedge; k = LocateVex(G,u); for(j=0; j<G.vexnum; j++) { if(j != k) { closedge[j].adjvex = u; closedge[j].lowcost = G.arcs[k][j].adj; } } closedge[k].lowcost = 0; for(i=1; i<G.vexnum; i++) { k = Minimum(G,closedge); cout<<"("<<closedge[k].adjvex<<","<<G.vexs[k]<<","<<closedge[k].lowcost<<")"<<endl; closedge[k].lowcost = 0; for(j=0; j<G.vexnum; ++j) { if(G.arcs[k][j].adj < closedge[j].lowcost) { closedge[j].adjvex = G.vexs[k]; closedge[j].lowcost= G.arcs[k][j].adj; } } }
第三次顺序结构实训

实训案例1:计算一个数的逆序数。
【案例学习目标】通过本案便的实训练习,熟悉各种算术运算符的使用。
【案例知识要点】掌握算术运行符的使用,能正确定义程序中所用到的变量,并能熟练使用scanf()函数输入用户所需的数据,熟练使用printf()输出结果。
【案例完成步骤】先将以下程序补充完整,再上机调试以下程序,观察其运行结果。
程序模板如下:#include "stdio.h"main(){ /*变量初始化*/int a,b,c,x,y;printf("从键盘输入一个3位整数存放在变量x中:\n");scanf(_________________);/*求一个数的个位、十位和百位*/c=_______________________; /*求x的百位数*/b=_______________________; /*求x的十位数*/a=________________________; /*求x的个位数*/y=________________________;/*求逆序数*//*输出结果*/printf("数%d逆序输出结果为:%d\n",x,y);getch();}案例说明:该案例需要从键盘中输入一个整数,为方便起见,假设此整数为一个三位整数,如589。
则要求输出结果为985。
实现此案例的关键在于如何从一个整数取出其各位数字。
可使用算术运算符%(求余运算)或/(整除运算)来实现。
实训2:格式输入函数scanf()、格式输出函数printf()的用法【案例学习目标】通过本案例的实训练习,熟悉各种格式符的使用方法,会使用各种格式控制输出不同盟的数据。
【案例知识要点】基本数据类型的格式符、格式输入函数scanf()与格式输出函数printf()的用法。
【案例完成步骤】步骤一:上机调试以下程序,并注意如何输入数据以确保变量能正确接收.main( ){/*变量初始化*/int n1,n2;float f1,f2;scanf("%c%c",&c1,&c2);scanf("%d%d",&n1,&n2);scanf("%f%f",&f1,&f2);/*输出结果*/printf("c1=%c,c2=%c\n",c1,c2);printf("n1=%d,n2=%d\n",n1,n2);printf("f1=%.2f,f2=%.2f\n",f1,f2);getch();}正确的输入方法为:aA↙123 -123↙3.456 -3.456↙输出结果如下:c1=a,c2=An1=123,n2=-123f1=3.45,f2=-3.46 。
OO第三次作业总结

OO第三次作业总结零、写在前⾯第三单元的作业题⽬为根据JML规格实现社交关系模拟系统,主要⽬的为学习并掌握JML规格的书写,学会根据已有的JML进⾏代码编写,熟练使⽤图论⽅法进⾏社交关系模拟系统的实现,并掌握容器⽅法的复杂度、图轮各种算法的复杂度,由此进⾏性能优化。
客观来说作业的难度偏简单(因为没有JML的书写,只是根据规格写代码,实验⾥的JML书写还是费了挺⼤功夫的)。
第⼀次作业进⾏翻译,需要优化联通分量的算法;第⼆次作业添加了⼏个类,还是进⾏翻译,需要学会维护变量以提⾼性能,第三次作业依然是进⾏翻译,需要运⽤最短路径算法的堆优化提⾼性能。
对于我来说,在第⼀次作业中就想⽤dfs试⼀试会不会TLE,不想改并查集,结果被hack了6⼑;第⼆次作业没什么问题;第三次作业最短路径算法出了⼀些⼩问题,TLE了⼀个,挺不应该的。
总的来说,这个unit作业的难度在于线下样例的构造和对拍,以及对CPU时间的把控。
当然,这个unit的学习不应该仅限于作业,作业的⾼分不能证明我们这个unit学好了。
因为作业只涵盖JML的翻译,剩下的如JML的书写还是需要学习的,当然,规格的设计同样重要,通过规格进⾏形式化验证也是我们需要学习的点。
注:为了分析⽅便,我将“(1)总结分析⾃⼰实现规格所采取的设计策略(3)总结分析容器选择和使⽤的经验(4)针对本单元容易出现的性能问题,总结分析原因如果⾃⼰作业没有出现,分析⾃⼰的设计为何可以避免(5)梳理⾃⼰的作业架构设计,特别是图模型构建与维护策略”放⼊“分析作业”⼤标题中,分作业进⾏分析。
“(2)结合课程内容,整理基于JML规格来设计测试的⽅法和策略”这⼀⽅⾯将在之后进⾏分析。
⼀、分析作业第⼀次作业先上类图:(1)设计策略:引⽤官⽅包,就建⽴了MyPerson、MyNetwork以及⼀系列异常类,为了增加计数功能,我建⽴了Count类,其中建⽴了例如sumEqualPersonId的静态属性记录每个异常的总出现次数,在getSumEqualPersonId⽅法中直接进⾏sumEqualPersonId++,之后return,相当于获得了⼀类异常的计数;建⽴了PersonNotFoundMap的HashMap,⽤来建⽴id与出现此类异常的关系,建⽴addSinglePersonNotFound,每次⽬标id出现异常就放⼊map中或+1,这样实现了计数功能。
上海交大_计算机组成与系统结构第3次作业最新最完整

上海交大_计算机组成与系统结构第3次作业最新最完整计算机组成与系统结构第三次作业第4章P112习题13:某微机的指令格式如下所示:解:15 10 9 8 7 0OP X DOP:操作码;D:位移量;X:寻址特征位,X=00:直接寻址;X=01:用变址寄存器X1进行变址;X=10:用变址寄存器X2进行变址;X=11:相对寻址。
设(PC)=1234H,(X1)=0037H,(X2)=1122H,请确定下列指令的有效地址。
(1)6723H (2)4444H (3)1282H (4)4321H解:(1)6223H=0110011100100011B,X=11,相对寻址,有效地址=PC+D=1234H+23H=1257H(2)4444H=0100010001000100B,X=00,直接寻址,有效地址=D=44H(3)1282H=0001001010000010B,X=10,变址寻址,有效地址=X2+D=1122H+82H=11A24H(4)4321H=0100001100100001B,X=11,相对寻址,有效地址=PC+D=1234H+21H=1255H第5章P159习题22、23、24、2522、参见如图所示的数据通路,IR为指令寄存器,PC为程序计数器(具有自增功能),M为主存(受R/W信号控制),AR为地址寄存器,DR为数据缓冲寄存器,ALU由+、-控制信号决定完成何种操作,控制信号G控制的是一个门电路。
另外,线上标注有控制信号,例如Yi表示Y寄存器的输入控制信号,R1o为寄存器R1的输出控制信号,未标字符的线为直通线,不受控制。
存数指令“STA R1, (R2)”的含义是将寄存器R1的内容传送至(R2)为地址的主存单元中,请画出其指令周期流程图,并列出相应微操作控制信号序列。
IRPCARMDRXYA L UR0R1R2R3G+-IR iPC iAR iR/WDR iR0iR3iX iY iIR o PC oDR o R0oR3oA 总线B 总线解:STA R1, (R2)(R1) → (R2)23、参见习题22的数据通路。
西安交通大学《数据结构》在线作业-003

《数据结构》在线作业若有18个元素的有序表存放在一维数组A[19]中,第一个元素放A[1]中,现进行二分查找,则查找A[3]的比较序列的下标依次为()A:1,2,3B:9,5,2,3C:9,5,3D:9,4,2,3正确选项:D利用直接插入排序法的思想建立一个有序线性表的时间复杂度为()。
A:O(n)B:O(nlog2n)C:O(n)D:O(1og2n)正确选项:C若一棵二叉树有10个度为2的结点,则该二叉树的叶子结点的个数为()。
A:9B:11C:12D:不能确定正确选项:B已知二维数组A[4,6]采用行优先存储结构,每个元素占用3 个存储单元,并且A[1,1]的存储地址为1200,元素A[[2,4]的存储地址是()。
A:1221B:1227C:1239D:1257正确选项:B设顺序线性表中有n个数据元素,则删除表中第i个元素需要移动()个元素。
A:n-iB:n+l-iC:n-1-iD:i正确选项:A设某棵三叉树中有40个结点,则该三叉树的最小高度为()。
A:3B:4C:5D:6正确选项:B对5个不同的数据元素进行直接插入排序,最多需要进行()次比较。
A:8B:10C:15D:25正确选项:BA:AB:BC:CD:D正确选项:A下列说法中,正确的是()。
A:度为2的树是二叉树B:度为2的有序树是二叉树C:子树有严格的左、右之分的树是二叉树D:子树有严格的左、右之分,且度不超过2的树是二叉树正确选项:D设一个顺序有序表A[1:14]中有14个元素,则采用二分法查找元素A[4]的过程中比较元素的顺序为()A:A[1],A[2],A[3],A[4]B:A[1],A[14],A[7],A[4]C:A[7],A[3],A[5],A[4]D:A[7],A[5],A[3],A[4]正确选项:C设一条单链表的头指针变量为head且该链表没有头结点,则其判空条件是()。
A:head==0B:head- next==0C:head- next==headD:head!=0正确选项:A设某棵二叉树的中序遍历序列为ABCD,前序遍历序列为CABD,则后序遍历该二叉树得到序列为()A:BADCB:BCDAC:CDABD:CBDA正确选项:A程序段s=i=0;do{i=i+1;s=s+i;}while(i =n);的时间复杂度为()。
数据结构作业和实验题目文件

数据结构作业来源:《数据结构题集》(C语言版)严蔚敏吴伟民米宁编著(详见电子版)数据结构需上交的作业(算法设计题)第二章(P17)第一次作业:第2.11题、第2.12题、第2.21题第二次作业:第2.19题、第2.22题、第2.24题选做:2.32(有利于熟悉和掌握单循环链表和双向循环链表的操作)2.28(该应用题可模拟Web缓存替换算法LRU/LFU,有实际应用价值)第三章(P24)第三次作业:第3.15题、第3.17题、第3.19题、第3.28题、第3.30题、第3.31题选做:3.34(练习双端队列基本操作,模拟列车车厢实际调度)第四章(P27)第四次作业:第4.24题、第4.25题、第4.26题选做:4.28(掌握串的模式匹配算法在链式存储结构上的实现,有实际应用价值)第五章(P34)第五次作业:第5.19题、第5.21题、第5.25题选做:5.26(熟悉稀疏矩阵的十字链表的存储结构,为研究图的十字链表存储结构做准备)第六章(P43)第六次作业:第6.37题、第6.42题、第6.43题第七次作业:第6.44题、第6.47题、第6.54题第七章(P48)第八次作业:第7.14题、第7.15题、第7.16题选做:7.27(在求简单回路过程中进一步熟悉和掌握图的遍历方法的应用)第九章(P58)第九次作业:第9.25题、第9.31题、第9.33题第十章(P64)第十次作业:第10.23题、第10.24题、第10.26题、第10.27题、第10.33题作业提交时间随课程进度,每讲完一章后的一周内提交纸质作业。
算法设计作业成绩评定和分级依据A(90-100):按作业题目要求完成算法设计题目,满足算法设计的要求,即算法设计正确、可读性好、健壮性好、高效率及低存储量。
最好经过上机编程测试,能够得出正确结果。
擅于总结在设计算法过程中的经验、教训,擅于与同学沟通,交流经验,对一个作业题目,设计多种解法。
B(80-89):按作业题目要求完成算法设计题目,满足算法设计的要求,即算法设计正确、可读性好、健壮性好、高效率及低存储量。
数据结构 第一二三阶段在线作业

第一次在线作业单选题 (共40道题)1.(2.5分)程序段FOR i:=n-1 DOWNTO 1 DO FOR j:=1 TO i DO IF A[j]> A[j+1] THEN•C、O(n3)•D、O(n2)我的答案:D 此题得分:2.5分2.(2.5分)若长度为n的线性表采用顺序存储结构,在其第i个位置插入一个新元素的算法的时间复杂•A、O(0)•B、O(1)•C、O(n)•D、O(n2)我的答案:C 此题得分:2.5分•B、待处理数据的初态•C、A和B我的答案:C 此题得分:2.5分•A、算法最终必须由计算机程序实现•B、为解决某问题的算法同为该问题编写的程序含义是相同的•C、算法的可行性是指指令不能有二义性•D、以上几个都是错误的我的答案:D 此题得分:2.5分•A、算法原地工作的含义是指不需要任何额外的辅助空间•B、在相同的规模n下,复杂度O(n)的算法在时间上总是优于复杂度O(2n)的算法•C、所谓时间复杂度是指最坏情况下,估算算法执行时间的一个上界•D、同一个算法,实现语言的级别越高,执行效率就不定我的答案:A 此题得分:2.5分•A、动态结构、静态结构•B、顺序结构、链式结构•C、线性结构、非线性结构•D、初等结构、构造型结构我的答案:C 此题得分:2.5分•A、广义表•B、二叉树•C、线索树•D、双向链表我的答案:A 此题得分:2.5分10.(2.5分)在下面的程序段中,对x的赋值语句的频度为()FOR i:=1 TO n DO FOR j:=1 T•A、O(2n)•B、O(n)•C、O(n2)•D、O(log2n)我的答案:C 此题得分:2.5分11.(2.5分)以下数据结构中,()是非线性数据结构•A、树•B、字符串•C、队•D、栈我的答案:A 此题得分:2.5分•A、栈•B、队列•C、完全二叉树•D、堆我的答案:C 此题得分:2.5分•A、线性表采用顺序存储,必须占用一片连续的存储单元。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第三次作业一、选择题1、在按行优先顺序存储的三元组表中,下述陈述错误的是 D 。
A. 同一行的非零元素,是按列号递增次序存储的B. 同一列的非零元素,是按行号递增次序存储的C. 三元组表中三元组行号是非递减的D. 三元组表中三元组列号是非递减的2、在稀疏矩阵的三元组表示法中,每个三元组表示 D 。
A. 矩阵中非零元素的值B. 矩阵中数据元素的行号和列号C. 矩阵中数据元素的行号、列号和值D. 矩阵中非零数据元素的行号、列号和值3、对特殊矩阵采用压缩存储的目的主要是为了 D 。
A. 表达变得简单B. 对矩阵元素的存取变得简单C. 去掉矩阵中的多余元素D. 减少不必要的存储空间4、广义表是线性表的推广,它们之间的区别在于 A 。
A. 能否使用子表B. 能否使用原子项C. 表的长度D. 是否能为空5、已知广义表(a, b, c, d)的表头是 A,则表尾是 D ;A. aB. ()C. (a, b, c, d)D. (b, c, d)//第一个元素为表头,其余元素组成的表为表尾6、下面说法不正确的是 A 。
A. 广义表的表头总是一个广义表B. 广义表的表尾总是一个广义表C. 广义表难以用顺序存储结构表示D. 广义表可以是一个多层次的结构7、若广义表A满足Head(A)=Tail(A),则A为 B 。
A. ( )B. (())C. (( ),( ))D. (( ), ( ), ( ))8、在一棵树中,如果结点A有3个兄弟,B是A的双亲,则B的度为 DA. 1B. 2C. 3D. 4//双亲即父节点9、深度为h的完全二叉树至少有 D 个结点,至多有 B 个结点A. 2hB. 2h-1C. 2h+1D. 2h-1//满二叉树是完全二叉树结点最多的情况10、具有n个结点的满二叉树有个叶结点。
A. n/2B. (n-1)/2C. (n+1)/2D. n/2+1//n个结点的满二叉树深度:(2^h)-1=n, 叶结点的个数:x=2^(h-1)=(2^h)/2//所以,x=(n+1)/211、一棵具有25个叶结点的完全二叉树最多有个结点。
A. 48B. 49C. 50D. 51//完全二叉树:结点最多时k-1层最右非终结结点只有一个左分支,此时,度为0的只有叶节点,25个,度为1的只有非终结结点1个,度为2的有25-1个,所以结点最多为25+1+24=50个12、已知二叉树的先根遍历序列是ABCDEF,中根遍历序列是CBAEDF,则后根遍历序列是 A 。
A. CBEFDAB. FEDCBAC. CBEDFAD. 不定13、具有10个叶结点的二叉树中有 B 个度为2的结点。
A. 8B. 9C. 10D. 1114、一棵非空二叉树的先序遍历序列与后序遍历序列正好相反,则该二叉树一定满足D 。
A. 所有非叶结点均无左孩子B. 所有非叶结点均无右孩子C. 只有一个叶子结点D. A和B同时成立//蜕化的二叉树,单链表,A的时候成立,B的时候也成立二、填空题1、稀疏矩阵一般压缩存储的方式有三种,分别是三原组存储、行指针链表和十字链表。
2、二维数组M中每个元素的长度是3字节,行下标i从0~7,列下标j从0~9,从首地址&M[0][0]开始连续存放在存储器中。
若按行优先的方式存放,元素M[7][5]的起始地址为M[0][0]+225;若按列优先方式存放,元素M[7][5]的起始地址为M[0][0]+141。
//LOC(M[7][5])= LOC(M[0][0])+ (7*10+5 ) * 3=LOC(M[0][0])+225//LOC(M[7][5])=LOC(M[0][0])+(5*8+7)*3=LOC([0][0])+1413、广义表(a, (a, b), d, e, ((i, j), k))的长度是 5 ,深度是3。
4、设广义表A( ( ( ), (a, (b), c) ) ),则Cal(Cdr(Cal(Cdr(Cal(A))))= (b)//A的头的尾的头的尾的头//取头不加括号,取尾加括号5、一棵二叉树有67个结点,结点的度是0和2。
问这棵二叉树中度为2的结点有33 个。
//度为0的结点是叶结点,因此度为0的结点比度为2的结点多16、含A, B, C三个结点的不同形态的二叉树有5棵。
//只有高度为3和高度为2两种情况7、含有4个度为2的结点和5个叶子结点的完全二叉树,有 1 或0 个度为1的结点。
8、具有100个结点的完全二叉树的叶子结点数为 50 。
9、在用左右链表示的具有n个结点的二叉树中,共有 2n 个指针域,其中 n-1个指针域用于指向其左右孩子,剩下的 n+1个指针域是空的。
//度为1的结点的指针域一个指向左右孩子,一个为空,度为2的指针域都指向左右孩子,度为0的结点即叶节点指针域都为空,而叶节点比度为2的结点多一个,所以整体上空指针域比指向孩子的指针域多2个//三四大题程序合并了三、试编写一个求三元组顺序表示的稀疏矩阵对角线元素之和的算法四、当具有相同行值和列值的稀疏矩阵A和B均以三元组顺序表方式存储时,试写出矩阵相加的算法,其结果存放在以行逻辑链接顺序表方式存储的矩阵C中。
算法分析:矩阵相加就是将两个矩阵中同一位置的元素值相加。
由于两个稀疏矩阵的非零元素按三元组表形式存放,在建立新的三元组表C时,为了使三元组元素仍按行优先排列,所以每次插入的三元组不一定是A的,按照矩阵元素的行列去找A中的三元组,若有,则加入C,同时,这个元素如果在B中也有,则加上B的这个元素值,否则这个值就不变;如果A中没有,则找B,有则插入C,无则查找下一个矩阵元素。
//三元组表示的稀疏矩阵对角线元素相加,以及稀疏矩阵相加#include<iostream>using namespace std;#define NumVertices 6//稀疏矩阵非零元素个数struct node{int row;//行int col;//列int data;//值};typedef node triple;//三元组void Input(triple a[])//输入三元组{cout<<"请输入系数矩阵的行、列数和非零元素个数:"<<endl;cin>>a[0].row>>a[0].col>>a[0].data;if(a[0].row != a[0].col)cout<<"请注意您输入的系数矩阵不是n阶矩阵,无法求对角元素的和!"<<endl;for(int i=1;i<=a[0].data;i++){cout<<"请以按行优先的规则依次输入第<<i<<个非零元素的下标和值:"<<endl;cin>>a[i].row>>a[i].col>>a[i].data;}void Init(triple a[])//初始化三元祖{a[0].row = 4; a[0].col = 4; a[0].data = 6;a[1].row = 0; a[1].col = 0; a[1].data = 50;a[2].row = 1; a[2].col = 0; a[2].data = 10;a[3].row = 1; a[3].col = 2; a[3].data = 20;a[4].row = 3; a[4].col = 0; a[4].data = -30;a[5].row = 3; a[5].col = 2; a[5].data = -60;a[6].row = 3; a[6].col = 3; a[6].data = 5;}int Find(triple a[],int row,int col)//判断三元组A所标示的稀疏矩阵是否存在下标[row][col]的非零元素,存在的话返回该非零元素{for(int i=1;i<=a[0].data;i++){if(a[i].row == row && a[i].col == col)return a[i].data;}return 0;}int Sum(triple a[])//求对角矩阵对角元素的和{int i,sum=0;if (a[0].row!=a[0].col)cout<<"此稀疏矩阵不是n*n矩阵,无法求对角元素和"<<endl;elsefor (i=1; i<=a[0].data; i++)if (a[i].row==a[i].col ||a[i].row+a[i].col == a[0].row-1)sum+=a[i].data;return sum;}void Print(triple *a)//输出三元组{for(int j=0;j<=a[0].data;j++)cout<<a[j].row<<'\t'<<a[j].col<<'\t'<<a[j].data<<endl;}void PrintMT(triple *a)//输出三元组所表示的稀疏矩阵{for(int i=0;i<a[0].row;i++){for(int j=0;j<a[0].col;j++)cout<<Find(a,i,j)<<'\t';cout<<endl;}}void Combine(triple a[],triple b[],triple c[])//三元组表示的稀疏矩阵相加{c[0].row = a[0].row;c[0].col = a[0].col;int cdata = a[0].data+b[0].data;//c的临时非零元素个数int cmark = 1;for(int i = 0;i<c[0].row;i++)for(int j = 0;j<c[0].col;j++){if(Find(a,i,j) && Find(b,i,j))//a和b都有[i][j]坐标的非零元素{c[cmark].row = i;c[cmark].col = j;c[cmark].data = Find(a,i,j)+Find(b,i,j);cdata--;cmark++;//cout<<c[cmark].row<<'\t'<<c[cmark].col<<'\t'<<c[cmark].data<<endl;}else if(Find(a,i,j))//a有[i][j]坐标的非零元素,b没有{c[cmark].row = i;c[cmark].col = j;c[cmark].data = Find(a,i,j);cmark++;}else if(Find(b,i,j))//b有[i][j]坐标的非零元素,a没有{c[cmark].row = i;c[cmark].col = j;c[cmark].data = Find(b,i,j);cmark++;}}c[0].data = cdata;//最终c的非零元素个数}void main(){triple a[NumVertices+1];Init(a);cout<<"您输入的三元组:"<<endl;Print(a);cout<<"您输入的三元组表示的稀疏矩阵:"<<endl;PrintMT(a);cout<<"稀疏矩阵对角元素之和为:"<<Sum(a)<<endl;cout<<"a和a相加:"<<endl;triple c[20];Combine(a,a,c);//将a和a相加放进c里面cout<<"相加后c三元组为:"<<endl;Print(c);cout<<"相加后的稀疏矩阵为:"<<endl;PrintMT(c);}五、设有一个稀疏矩阵:⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡--000600020007000050000000008100300000000401、写出三元组顺序表存储表示2、写出十字链表存储的顺序表示六、画出广义表LS=(( ), (e), (a, (b, c, d)))的头尾链表存储结构(类似于教材P70图2-27.9)。