《2022年数据结构矩阵的转置 .pdf》由会员分享,可在线阅读,更多相关《2022年数据结构矩阵的转置 .pdf(7页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、/* c1.h ( 程序名 ) */ #include #include #include /* malloc()等*/ #include /* INT_MAX等 */ #include /* EOF(=Z或 F6),NULL */ #include /* atoi() */ #include /* eof() */ #include /* floor(),ceil(),abs() */ #include /* exit() */ /* 函数结果状态代码*/ #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define
2、INFEASIBLE -1 /* #define OVERFLOW -2 因为在 math.h 中已定义OVERFLOW 的值为 3,故去掉此行*/ typedef int Status; /* Status 是函数的类型 ,其值是函数结果状态代码,如OK 等*/ typedef int Boolean; /* Boolean是布尔类型 ,其值是 TRUE 或 FALSE */ /* c5-2.h 稀疏矩阵的三元组顺序表存储表示*/ #define MAXSIZE 100 /* 非零元个数的最大值*/ typedef struct int i,j; /* 行下标 ,列下标*/ ElemType
3、 e; /* 非零元素值*/ Triple; typedef struct Triple dataMAXSIZE+1; /* 非零元三元组表,data0未用*/ int mu,nu,tu; /* 矩阵的行数、列数和非零元个数*/ TSMatrix; 三元组稀疏矩阵的基本操作,包括算法5.1(9 个 ) */ Status CreateSMatrix(TSMatrix *M) /* 创建稀疏矩阵M */ int i,m,n; ElemType e; Status k; printf( 请输入矩阵的行数,列数 ,非零元素数: ); scanf(%d,%d,%d,&(*M).mu,&(*M).nu,
4、&(*M).tu); (*M).data0.i=0; /* 为以下比较顺序做准备*/ for(i=1;i=(*M).tu;i+) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 7 页 - - - - - - - - - do printf( 请按行序顺序输入第%d 个非零元素所在的行(1%d), 列 (1%d),元素值:,i,(*M).mu,(*M).nu); scanf(%d,%d,%d,&m,&n,&e); k=0; if(m(*M).mu|n(*M).nu) /*
5、 行或列超出范围*/ k=1; if(m(*M).datai-1.i|m=(*M).datai-1.i&n=(*M).datai-1.j) /* 行或列的顺序有错 */ k=1; while(k); (*M).datai.i=m; (*M).datai.j=n; (*M).datai.e=e; return OK; void DestroySMatrix(TSMatrix *M) /* 销毁稀疏矩阵M */ (*M).mu=0; (*M).nu=0; (*M).tu=0; void PrintSMatrix(TSMatrix M) /* 输出稀疏矩阵M */ int i; printf(%d行
6、%d 列%d 个非零元素。 n,M.mu,M.nu,M.tu); printf( 行列元素值 n); for(i=1;i=M.tu;i+) printf(%2d%4d%8dn,M.datai.i,M.datai.j,M.datai.e); Status CopySMatrix(TSMatrix M,TSMatrix *T) /* 由稀疏矩阵M 复制得到 T */ (*T)=M; return OK; int comp(int c1,int c2) /* 另加*/ /* AddSMatrix函数要用到*/ 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - -
7、- - - - - - 名师精心整理 - - - - - - - 第 2 页,共 7 页 - - - - - - - - - int i; if(c1c2) i=1; else if(c1=c2) i=0; else i=-1; return i; Status AddSMatrix(TSMatrix M,TSMatrix N,TSMatrix *Q) /* 求稀疏矩阵的和Q=M+N */ Triple *Mp,*Me,*Np,*Ne,*Qh,*Qe; if(M.mu!=N.mu) return ERROR; if(M.nu!=N.nu) return ERROR; (*Q).mu=M.mu;
8、 (*Q).nu=M.nu; Mp=&M.data1; /* Mp的初值指向矩阵M 的非零元素首地址*/ Np=&N.data1; /* Np的初值指向矩阵N 的非零元素首地址*/ Me=&M.dataM.tu; /* Me指向矩阵M 的非零元素尾地址*/ Ne=&N.dataN.tu; /* Ne指向矩阵N 的非零元素尾地址*/ Qh=Qe=(*Q).data; /* Qh 、Qe 的初值指向矩阵Q 的非零元素首地址的前一地址*/ while(Mp=Me&Npi,Np-i) case 1: *Qe=*Mp; Mp+; break; case 0: switch(comp(Mp-j,Np-j)
9、 /* M、 N 矩阵当前非零元素的行相等,继续比较列*/ case 1: *Qe=*Mp; Mp+; break; case 0: *Qe=*Mp; Qe-e+=Np-e; if(!Qe-e) /* 元素值为0,不存入压缩矩阵*/ Qe-; Mp+; Np+; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 7 页 - - - - - - - - - break; case -1: *Qe=*Np; Np+; break; case -1: *Qe=*Np; Np+;
10、if(MpMe) /* 矩阵 M 的元素全部处理完毕*/ while(NpNe) /* 矩阵 N 的元素全部处理完毕*/ while(Mp=Me) Qe+; *Qe=*Mp; Mp+; (*Q).tu=Qe-Qh; /* 矩阵 Q 的非零元素个数*/ return OK; Status SubtSMatrix(TSMatrix M,TSMatrix N,TSMatrix *Q) /* 求稀疏矩阵的差Q=M-N */ int i; for(i=1;i=N.tu;i+) N.datai.e*=-1; AddSMatrix(M,N,Q); return OK; Status MultSMatrix(
11、TSMatrix M,TSMatrix N,TSMatrix *Q) /* 求稀疏矩阵的乘积Q=M*N */ int i,j,h=M.mu,l=N.nu,Qn=0; /* h,l 分别为矩阵Q 的行、列值 ,Qn 为矩阵 Q 的非零元素个数,初值为0 */ ElemType *Qe; if(M.nu!=N.mu) return ERROR; (*Q).mu=M.mu; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 7 页 - - - - - - - - - (*Q).n
12、u=N.nu; Qe=(ElemType *)malloc(h*l*sizeof(ElemType); /* Qe为矩阵 Q 的临时数组*/ /* 矩阵 Q 的第 i 行 j 列的元素值存于*(Qe+(i-1)*l+j-1)中,初值为0 */ for(i=0;ih*l;i+) *(Qe+i)=0; /* 赋初值 0 */ for(i=1;i=M.tu;i+) /* 矩阵元素相乘,结果累加到Qe */ for(j=1;j=N.tu;j+) if(M.datai.j=N.dataj.i) *(Qe+(M.datai.i-1)*l+N.dataj.j-1)+=M.datai.e*N.dataj.e;
13、 for(i=1;i=M.mu;i+) for(j=1;j=N.nu;j+) if(*(Qe+(i-1)*l+j-1)!=0) Qn+; (*Q).dataQn.e=*(Qe+(i-1)*l+j-1); (*Q).dataQn.i=i; (*Q).dataQn.j=j; free(Qe); (*Q).tu=Qn; return OK; Status TransposeSMatrix(TSMatrix M,TSMatrix *T) /* 求稀疏矩阵M 的转置矩阵T。算法 5.1 */ int p,q,col; (*T).mu=M.nu; (*T).nu=M.mu; (*T).tu=M.tu; i
14、f(*T).tu) q=1; for(col=1;col=M.nu;+col) for(p=1;p=M.tu;+p) if(M.datap.j=col) (*T).dataq.i=M.datap.j; (*T).dataq.j=M.datap.i; (*T).dataq.e=M.datap.e; +q; return OK; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 7 页 - - - - - - - - - /* main5-2.c 检验 bo5-2.c 的主程序
15、*/ #includec1.h typedef int ElemType; #includec5-2.h #includebo5-2.c void main() TSMatrix A,B,C; printf( 创建矩阵A: ); CreateSMatrix(&A); PrintSMatrix(A); printf( 由矩阵 A 复制矩阵B: ); CopySMatrix(A,&B); PrintSMatrix(B); DestroySMatrix(&B); printf( 销毁矩阵B 后 :n); PrintSMatrix(B); printf( 创建矩阵B2:(与矩阵 A 的行、列数相同,行
16、、列分别为%d,%d)n,A.mu,A.nu); CreateSMatrix(&B); PrintSMatrix(B); printf( 矩阵 C1(A+B): ); AddSMatrix(A,B,&C); PrintSMatrix(C); DestroySMatrix(&C); printf( 矩阵 C2(A-B): ); SubtSMatrix(A,B,&C); PrintSMatrix(C); DestroySMatrix(&C); printf( 矩阵 C3(A 的转置 ): ); TransposeSMatrix(A,&C); PrintSMatrix(C); DestroySMat
17、rix(&A); DestroySMatrix(&B); DestroySMatrix(&C); printf( 创建矩阵A2: ); CreateSMatrix(&A); PrintSMatrix(A); printf( 创建矩阵B3:(行数应与矩阵A2 的列数相同 =%d)n,A.nu); CreateSMatrix(&B); PrintSMatrix(B); printf( 矩阵 C5(A*B): ); MultSMatrix(A,B,&C); PrintSMatrix(C); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 7 页 - - - - - - - - - DestroySMatrix(&A); DestroySMatrix(&B); DestroySMatrix(&C); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 7 页 - - - - - - - - -
限制150内