}
if(j>3) //控制跳出死循环 {
printf(\本次输入失败!\
return ERROR; }
printf(\按行序输入第%d个非零元素所在的行(1~%d)列(1~%d)值:scanf(\k=0;
if(m<1||m>M.mu||n<1||n>M.nu) //行或列超出范围 k=1;
if(m \ k=1; }while(k); M.data[i].i=m; M.data[i].j=n; M.data[i].e=e; } //end for printf(\return(OK); (3)销毁矩阵 void DestroySMatrix(RLSMatrix &M) //销毁稀疏矩阵M { M.mu=0; M.nu=0; M.tu=0; } (4)遍历矩阵 void PrinRLSMatrix(RLSMatrix M) //遍历稀疏矩阵 M { int i; printf(\稀疏矩阵对应的三元组表为:\\n\\n\printf(\行 列 元素值、\\n\\n\ for(i=1;i<=M.tu;i++) printf(\printf(\ } (5)打印矩阵函数 void print(RLSMatrix A) //打印矩阵函数,以通常形式输出矩阵 { int k=1,a,b; printf(\稀疏矩阵的通常形式为:\\n\\n\ int M[MAXSIZE][MAXSIZE]; 6 for(a=0;a for(a=0;a printf(\ | \ for(b=0;b M[A.data[k].i-1][A.data[k].j-1]=A.data[k].e; k++; for(b=0;b while(k<=A.tu) } } (6)工作区函数,显示程序菜单 void showtip() //菜单 { printf(\ ********************请选择要执行的操作 ********************\\n\\n\ printf(\ 1 采用一般算法实现 \\n\\n\ printf(\ 2 采用快速转置的算法实现 \\n\\n\ printf(\ **********************************************************\\n\} (7)矩阵的转置(一般算法) TransposeSMatrix(RLSMatrix M,RLSMatrix &T) //求稀疏矩阵M的转置矩阵T { int p,q,col; T.mu=M.nu; T.nu=M.mu; T.tu=M.tu; if(T.tu) { q=1; for(col=1;col<=M.nu;++col) //按列序求转置 for(p=1;p<=M.tu;++p) if(M.data[p].j==col) { T.data[q].i=M.data[p].j; T.data[q].j=M.data[p].i; T.data[q].e=M.data[p].e; 7 } } ++q; } return OK; (8)快速转置算法 采用此算法时引用两个辅助数组num[],cpot[], num[col]表示矩阵M中第col列中非零元的个数,cpot[col]指示M中第col列的第一个非零元在b.data中的恰当位置。(即指M中每一列的第一个非零元在B中表示为第几个非零元) FastTransposeSMatrix(TSMatrix M,TSMatrix &T) { int p,q,t,col,*num,*cpot; num=(int*)malloc((M.nu+1)*sizeof(int)); cpot=(int*)malloc((M.nu+1)*sizeof(int)); T.mu=M.nu; T.nu=M.mu; T.tu=M.tu; if(T.tu) { for(col=1;col<=M.nu;++col) num[col]=0; for(t=1;t<=M.tu;++t) ++num[M.data[t].j]; cpot[1]=1; for(col=2;col<=M.nu;++col) cpot[col]=cpot[col-1]+num[col-1]; printf(\辅助数组的值为:\\n\\n\printf(\列号:\ for(t=1;t<=M.nu;++t) printf(\ printf(\printf(\ for(t=1;t<=M.nu;++t) printf(\printf(\printf(\for(t=1;t<=M.nu;++t) printf(\printf(\for(p=1;p<=M.tu;++p) { col=M.data[p].j; q=cpot[col]; T.data[q].i=M.data[p].j; 8 } } } T.data[q].j=M.data[p].i; T.data[q].e=M.data[p].e; ++cpot[col]; free(num); free(cpot); return OK; 五、测试分析 系统运行后显示主菜单,提示用户选择使用何种算法,如图所示。 图5——1 (主菜单) 5.1 一般算法 用户根据需要选择算法。 输入1,选择采用一般算法实现矩阵的转置。 图 5——2 提示用户创建矩阵A,输入矩阵A的行列值以及非零元个数,用户输入 3 4 5并回车(表示创建一个3行4列有5个非零元的稀疏矩阵),系统然后会提示用户输入非零元素对应的行、列、值 图5——3 输入完成后 回车 , 系统执行矩阵转置功能,得到结果,如图 9 (矩阵A对应的三元组表) (转置矩阵B对应的三元组表) (以阵列形式表示B) 图5——4 图5——5 图5——6 5.2 快速转置算法 用户若输入2,选择使用快速转置方法来实现 图5——7 输入数据后回车,得到结果如图: (矩阵A对应的三元组表) (辅助数组的值) (B的三元组表及其阵列形式) 图5——8 图5——9 图5——10 5.3 当用户输入3时,运用两种算法,输出采用不同算法运算的过程及结果。 本次转置操作执行完毕后,下面附有另一个菜单选项,提示用户是否继续输入其他矩阵,1表示继续输入不同的矩阵再次执行如上转置操作,0表示不继续输入,操作结束。如图: 10