1、1实验三 稀疏矩阵的三元组表示实现矩阵转置算法学院 专业 班 学号 姓名 一实习目的1. 掌握稀疏矩阵的三元组顺序表存储表示;2. 掌握稀疏矩阵三元组表示的传统转置算法的实现;3. 掌握稀疏矩阵三元组表示的快速转置算法的实现;二实习内容1. 稀疏矩阵的按三元组形式输入,即按行序输入非零元的行号、列号、值,实现传统转置算法,输出按通常的阵列形式输出。2. 稀疏矩阵的按三元组形式输入,即按行序输入非零元的行号、列号、值,实现快速转置算法,输出按通常的阵列形式输出。三实验步骤1. 三元组的定义#define MAX_SIZE 100 / 非零元个数的最大值struct Tripleint i,j;
2、/ 行下标,列下标ElemType e; / 非零元素值;struct TSMatrixstruct Triple dataMAX_SIZE+1; / 非零元三元组表, data0未用int mu,nu,tu; / 矩阵的行数、列数和非零元个数;2. 创建稀疏矩阵 M (按三元组形式输入,即按行序输入非零元的行号、列号、值)3. 编写三元组传统转置函数。 4. 编写三元组快速转置函数。4. .主函数 (1)程序代码#include “stdio.h“ #include “stdlib.h“#define MAX_SIZE 100 / 非零元个数的最大值typedef int ElemType;
3、struct Tripleint i,j; / 行下标,列下标ElemType e; / 非零元素值;struct TSMatrix2struct Triple dataMAX_SIZE+1; / 非零元三元组表, data0未用int mu,nu,tu; / 矩阵的行数、列数和非零元个数;int CreateSMatrix(TSMatrix ElemType e;int k;printf(“请输入矩阵的行数,列数,非零元素数:“);scanf(“%d,%d,%d“,if(M.tuMAX_SIZE)return -1;M.data0.i=0; / 为以下比较顺序做准备for(i=1;iM.mu
4、|nM.nu) / 行或列超出范围k=1;if(mi=i / 输出 p 所指元素的值p+; / p 指向下一个元素k+; / 计数器+1else / p 所指元素不是当前处理元素printf(“%3d“,0); / 输出 0printf(“n“);void TransposeSMatrix(TSMatrix M,TSMatrix 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.datap.j=col)T.dataq.i= M.datap.j;T.dataq
5、.j=M.datap.i; T.dataq.e= M.datap.e;+q;void FastTransposeSMatrix(TSMatrix M,TSMatrix num=(int *)malloc(M.nu+1)*sizeof(int); / 存 M 每列(T 每行)非零元素个数(0不用)cpot=(int *)malloc(M.nu+1)*sizeof(int); / 存 T 每行的下 1 个非零元素的存储位置(0不用)T.mu=M.nu; / 给 T 的行、列数与非零元素个数赋值T.nu=M.mu;4T.tu=M.tu;if(T.tu) / 是非零矩阵for(col=1;col=M.
6、nu;+col)numcol=0; / 计数器初值设为 0for(t=1;t=M.tu;+t) / 求 M 中每一列含非零元素个数 k=M.datat.j; +num col; cpot1=1; / T 的第 1 行的第 1 个非零元在 T.data 中的序号为 1for(col=2;col=M.nu;+col)cpotcol=cpotcol-1+numcol-1; / 求 T 的第 col 行的第 1 个非零元在 T.data 中的序号printf(“num 数组的值为:n“);for(col=1;col=M.nu;+col)printf(“%4d“,numcol); printf(“n“)
7、;printf(“转置前 cpot 数组的值为:n“);for(col=1;col=M.nu;+col)printf(“%4d“,cpotcol); printf(“n“);for(p=1;p=M.tu;+p) / 从 M 的第 1 个元素开始col= M.datap.j; / 求得在 M 中的列数q= cpotM.datap.j; / q 指示 M 当前的元素在 T 中的序号T.dataq.i=M.datap.j;T.dataq.j=M.datap.i;T.dataq.e=M.datap.e;+cpotcol; / T 第 col 行的下 1 个非零元在 T.data 中的序号printf(
8、“转置后 cpot 数组的值为:n“);for(col=1;col=M.nu;+col)printf(“%4d“,cpotcol); printf(“n“);free(num);free(cpot);void main()TSMatrix A,T;printf(“创建矩阵 A: “);CreateSMatrix(A);PrintSMatrix(A);5TransposeSMatrix(A,T); printf(“传统矩阵转置程序执行后的矩阵 t(A 的转置):n“);PrintSMatrix(T); FastTransposeSMatrix(A,T);printf(“快速矩阵转置程序执行后的矩阵 t(A 的转置):n“);PrintSMatrix(T); (2)调试程序(3) 运行程序(截图)四实习小结自己写