图5——11
用户输入1,再次出现如图5——1(主菜单)所示,提示继续输入,继续执行稀疏矩阵的转置操作。输入0则结束操作。
六、源程序清单
#include
#define ERROR 0
#define OVERFLOW 0 #define MAXSIZE 100 #define MAXRC 100 typedef int ElemType; typedef struct { int i,j; ElemType e; }Triple;
typedef struct {
Triple data[MAXSIZE+1]; //非零元三元组
int rpos[MAXRC+1]; //各行第一个非零元的位置表 int mu,nu,tu; //矩阵的行数、列数和非零元个数
}RLSMatrix;
CreateSMatrix(RLSMatrix &M) //创建稀疏矩阵M {
int i,m,n; ElemType e;
int k,j;
printf(\输入矩阵的行数、列数、非零元的个数:\scanf(\M.data[0].i=0; for(i=1;i<=M.tu;i++) { j=0;
11
do {
j++;
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 \ }while(k); M.data[i].i=m; M.data[i].j=n; M.data[i].e=e; } //end for printf(\ return(OK); } void DestroySMatrix(RLSMatrix &M) //销毁稀疏矩阵M { M.mu=0; M.nu=0; M.tu=0; } void PrinRLSMatrix(RLSMatrix M) //遍历稀疏矩阵 M { int i; printf(\稀疏矩阵对应的三元组表为:\\n\\n\printf(\行 列 元素值、\\n\\n\for(i=1;i<=M.tu;i++) printf(\ printf(\} void print(RLSMatrix A) //打印矩阵函数,以通常形式输出矩阵 { int k=1,a,b; printf(\稀疏矩阵的通常形式为:\\n\ int M[MAXSIZE][MAXSIZE]; 12 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) } } void showtip() //菜单 { printf(\ ********************请选择要执行的操作 & 1 ********************\\n\\n\ printf(\ 采用一般算法实现 &\\n\ printf(\ & 2 采用快速转置的算法实现 &\\n\ printf(\ & 3 同时采用两种算法,先显示一般算法,再显示快速算法 &\\n\ printf(\ **********************************************************\\n\\n\} ////头文件结束 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) 13 { T.data[q].i=M.data[p].j; T.data[q].j=M.data[p].i; T.data[q].e=M.data[p].e; ++q; } } return OK; } FastTransposeSMatrix(RLSMatrix M,RLSMatrix &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\ 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; 14 //快速转置算法 } { } } T.data[q].j=M.data[p].i; T.data[q].e=M.data[p].e; ++cpot[col]; free(num); free(cpot); return OK; void main() int result; int j; RLSMatrix A,B; //************************************************ COORD Co={0,0};DWORD Write; SetConsoleTitle(\稀疏矩阵的转置\\n\ HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleTextAttribute(hOut,FOREGROUND_RED|FOREGROUND_BLUE|FOREGROFillConsoleOutputAttribute(hOut,FOREGROUND_RED|FOREGROUND_BLUE|FOREGR UND_INTENSITY); OUND_INTENSITY,100000000,Co,&Write); ///windows的API函数,用来设置控制台标题 do { showtip(); //调用菜单函数 int i; scanf(\ switch(i) { case 1: printf(\创建矩阵A:\ if((result=CreateSMatrix(A))==0) exit(ERROR); PrinRLSMatrix(A); printf(\求A的转置矩阵B(一般算法):\\n\TransposeSMatrix(A,B); PrinRLSMatrix(B); print(B); DestroySMatrix(B); printf(\ case 2: printf(\创建矩阵A:\ 15