1、1、实验内容和要求1、 稀疏矩阵A,B均采用三元组表示,验证实现矩阵A快速转置算法,设计并验证A,B相加得到矩阵C的算法。(1) 从键盘输入矩阵的行数和列数,随机生成稀疏矩阵。(2) 设计算法将随机生成的稀疏矩阵转换成三元组顺序表示形式存储。(3) 设计算法将快速转置得到的与相加得到的三元组顺序表分别转换成矩阵形式。(4) 输出随机生成的稀疏矩阵A,B及其三元组顺序表、快速转置得到的与相加得到的三元组顺序表及其矩阵形式。2、实验过程及结果1、需求分析1、将随机生成的数定义为 int 型(为方便起见设定范围为-20 至 20(不含 0) ,可修改) ,三元组存储的元素分别为非零元的行下标、列下标
2、及该位置的元素值,零元不进行存储。实际上在生成稀疏矩阵时是随机选取一些位置生成非零元然后存入三元组中。2、从键盘输入矩阵的行数和列数后应能输出三元组顺序表及相应矩阵(按行和列排列形式输出) 。3、 程序能实现的功能包括:随机产生稀疏矩阵;输出阵列形式的矩阵;输出三元组顺序表;将矩阵快速转置;将两个稀疏矩阵相加生成新的矩阵。2、概要设计1、稀疏矩阵的抽象数据类型定义:ADT TSMatrix数据对象:D= aij|i=1,2,m,j=1,2,n;Ai,jElemSet,m 和 n 分别称为矩阵的行数和列数数据关系:R=Row ,ColRow=|1im, 1j n-1Col =|1im-1, 1j
3、n基本操作:CreateTSMatrix(typedef structint i,j;ElemType e;Triple;/数据类型 三元组typedef structTriple datamaxsize+1;/矩阵大小int mu,nu,tu; /TSMatrix;/矩阵抽象数据类型2、参数设置:#define maxsize 10000/-基本操作的算法描述-Status CreateTSMatrix(TSMatrix *M)/创建一个随机矩阵(data0未用)srand(int)time(NULL);printf(“Please Input The Lines And Columns O
4、f The Matrix:n“);printf(“.(矩阵的期望规格大于 4*5(或 5*4).n“);scanf(M-mu,M-nu);for(m=0;mmu;m+)for(n=0;nnu;n+)kmn=rand()%20;if(kmn=0)if(rand()%2)M-datap.e=rand()%20+1;elseM-datap.e=rand()%20-20;M-datap.i=m+1;M-datap.j=n+1;p+;M-tu=p-1; /p 从 1 开始,非零元个数刚好等于 p-1return OK;void PrintTSMatrix(TSMatrix M)/输出矩阵的三元组顺序表i
5、f(M.tu=0)printf(“无非零元!n“);elseprintf(“该矩阵的行数为%d、列数为%d、非零元素个数为%d.n 非零元的坐标及值:nn“,M.mu,M.nu,M.tu);printf(“ 行 列 元素值n“);for(i=1;ii=i /data0未用,p 从 data1开始p+;k+;elseprintf(“%4d“,0);printf(“n“);printf(“n“);int UnZore(TSMatrix M,int row,int col)while(orderdataorder.i=row;Q-dataorder.j=col;Q-dataorder.e=M.dat
6、aorder1.e+N.dataorder2.e;order+;else if(order1Q-dataorder.i=M.dataorder1.i;Q-dataorder.j=M.dataorder1.j;order+;else if(!order1)Q-dataorder.i=N.dataorder2.i;Q-dataorder.j=N.dataorder2.j;order+;Q-mu=M.mu;Q-nu=M.nu;Q-tu=order-1;return OK;elseprintf(“n 不是同型矩阵不能进行相加!n“);return ERROR;Status FastTransposeS
7、Matrix(TSMatrix M,TSMatrix *N)/采用三元组顺序表存储表示,求稀疏矩阵 M 的转置矩阵 NN-mu=M.nu;N-nu=M.mu;N-tu=M.tu;if(N-tu)for(i=1;idataq.i=M.datap.j;N-dataq.j=M.datap.i;N-dataq.e=M.datap.e;+cpoti;return OK; 主函数算法:void main()TSMatrix A,A1,B,C;printf(“矩阵 A:n“);CreateTSMatrix(PrintTSMatrix(A);PrintTSMatrix1(A);printf(“由矩阵 A 转置
8、得矩阵 A1.n“);FastTransposeSMatrix(A,PrintTSMatrix(A1);PrintTSMatrix1(A1);printf(“矩阵 B:n“);CreateTSMatrix(PrintTSMatrix(B);PrintTSMatrix1(B);printf(“矩阵 A 加矩阵 B 得到矩阵 C.n“);if(TSMatrix_Add(A,B,PrintTSMatrix1(C); 四、调试分析1、三元组顺序表的输出顺序应该是先按行排序再按列排序,即行主序,依次输出。2、生成的非零元应该有正数和负数,选取在-20 到 20 之间的数(不包括 0) ,生成随机数时同时
9、随机生成其正负号,为正数时将 rand()%20 再加 1,避免再产生 0,为负数时将 rand()%20-20。3、由于稀疏矩阵非零元个数极少,故要求矩阵规格在 4*5(或 5*4)以上为好,实际上生成非零元时其位置具备随机性,其个数也具备随机性,并不严格小于等于矩阵元素个数的 5%,因为控制其随机位置的是通过 rand()%20,当该随机数值为 0 时,将该位置做为非零元位置。开始时采取随机生成位置以便控制非零元个数小于等于矩阵元素个数的 5%,但是这样就不便于将非零元按行列次序存储,而是谁先生成就先存储谁,也无法避免出现重复位置的情况。4、实验没有采取二维数组的方法来形成矩阵,而是直接用
10、三元组存储的,在输出时通过 for 循环控制则可输出实现阵列形式的矩阵。3、用户说明与测试结果1、 本程序的运行环境为 windows 7(64 位)操作系统,执行文件为矩阵.exe;2、 进入演示程序后,即显示对话形式的提示操作过程,(1)提出输入矩阵的大小(2)按 enter 键输出随机生成的矩阵三元组顺序表和整个矩阵如图所示:(3)程序自动完成第一个矩阵的转置并输出;(4)提示输入矩阵 B 后,用户输入所需矩阵的行数和列数,然后程序将自动完成两个原始矩阵的相加,若不是同型矩阵则提示无法相加。如图所示:五、附录(源代码及注释)#include #include #include “time
11、.h“#define maxsize 10000#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0#define OVERFLOW -1typedef int ElemType;typedef int Status;typedef structint i,j;ElemType e;Triple;/数据类型 三元组typedef structTriple datamaxsize+1;/矩阵大小int mu,nu,tu; /TSMatrix;/矩阵抽象数据类型Status CreateTSMatrix(TSMatrix *M); /创建
12、矩阵void PrintTSMatrix(TSMatrix M); /输出矩阵非零元素void PrintTSMatrix1(TSMatrix M); /以阵列形式输出矩阵int UnZore(TSMatrix M,int row,int col); /判断位置(row,col)是否存在非零元素Status TSMatrix_Add(TSMatrix M,TSMatrix N,TSMatrix *Q); /将矩阵 M,N 相加得到 QStatus FastTransposeSMatrix(TSMatrix M,TSMatrix *N); /快速转置void main()TSMatrix A,A
13、1,B,C;printf(“矩阵 A:n“);CreateTSMatrix(PrintTSMatrix(A);PrintTSMatrix1(A);printf(“由矩阵 A 转置得矩阵 A1.n“);FastTransposeSMatrix(A,PrintTSMatrix(A1);PrintTSMatrix1(A1);printf(“矩阵 B:n“);CreateTSMatrix(PrintTSMatrix(B);PrintTSMatrix1(B);printf(“矩阵 A 加矩阵 B 得到矩阵 C.n“);if(TSMatrix_Add(A,B,PrintTSMatrix1(C);Statu
14、s CreateTSMatrix(TSMatrix *M)int m,n,p=1,num; /data0未用,p 从 1 开始;num 为非零元个数最大值int k100100;srand(int)time(NULL);printf(“Please Input The Lines And Columns Of The Matrix:n“);printf(“.(矩阵的期望规格大于 4*5(或 5*4).n“);printf(“The Line Number:“);scanf(“%d“,printf(“The Column Number:“);scanf(“%d“,/*for(m=1;mmu;m+
15、)for(n=1;nnu;n+)kmn=0;num=(m*n)/20;printf(“%d“,num);for(p=1;pmu+1;n=rand()%M-nu+1;if(rand()%2=1)kmn=rand()%20+1;else if(rand()%2=0)kmn=rand()%20-20;for(m=1;mmu;m+)for(n=1;nnu;n+)if(kmn!=0)M-datap.e=kmn;M-datap.i=m;M-datap.j=n;p+;*/for(m=0;mmu;m+)for(n=0;nnu;n+)kmn=rand()%20;if(kmn=0)if(rand()%2)M-da
16、tap.e=rand()%20+1;elseM-datap.e=rand()%20-20;M-datap.i=m+1;M-datap.j=n+1;p+;M-tu=p-1; /p 从 1 开始,刚好等于非零元个数-1return OK;void PrintTSMatrix(TSMatrix M)int i;if(M.tu=0)printf(“无非零元!n“);elseprintf(“该矩阵的行数为%d、列数为%d 、非零元素个数为%d.n 非零元的坐标及值:nn“,M.mu,M.nu,M.tu);printf(“ 行 列 元素值n“);for(i=1;ii=ip+;k+;elseprintf(“
17、%4d“,0);printf(“n“);printf(“n“);int UnZore(TSMatrix M,int row,int col)int order=1; /data0未用while(orderdataorder.i=row;Q-dataorder.j=col;Q-dataorder.e=M.dataorder1.e+N.dataorder2.e;order+;else if(order1Q-dataorder.i=M.dataorder1.i;Q-dataorder.j=M.dataorder1.j;order+;else if(!order1)Q-dataorder.i=N.da
18、taorder2.i;Q-dataorder.j=N.dataorder2.j;order+;Q-mu=M.mu;Q-nu=M.nu;Q-tu=order-1;return OK;elseprintf(“n 不是同型矩阵不能进行相加 !n“);return ERROR;Status FastTransposeSMatrix(TSMatrix M,TSMatrix *N)int i,t,p,q,num100,cpot100;N-mu=M.nu;N-nu=M.mu;N-tu=M.tu;if(N-tu)for(i=1;idataq.i=M.datap.j;N-dataq.j=M.datap.i;N-dataq.e=M.datap.e;+cpoti;return OK;