1、实验5数组实验5:数组一、实验目的深入研究数组的存储表示和实现技术,着重掌握对稀疏矩阵的表示方法及其运算的实现。二、问题描述稀疏矩阵是指那些多数元素为零的矩阵。利用稀疏特点进行存储和计算可以大大节省存储空间,提高效率。通过对稀疏矩阵的存储表示,实现矩阵的基本操作。三、实验要求1、要求矩阵的输入形式采用三元组表示,以“带行逻辑链接信息”的三元组顺序表表示稀疏矩阵。2、设计矩阵的逆置算法,实现矩阵的逆置。3、实现两个稀疏矩阵的相加、相减等运算。4、要求运算结果的矩阵则以通常的阵列形式出现。四、数据结构#define MAXSIZE 100 /假设该非零元个数的最大值为100 typedef str
2、uct int i,j; /该非零元的行下标和列下标 int e; /该非零元的值Triple; typedef struct Triple dataMAXSIZE+1; /非零元三元组表,data0未用 int mu,nu,tu; /矩阵的行数、列数和非零元的个数 TSMatrix;五、实验环境PC微机DOS操作系统或 Windows 操作系统Turbo C 程序集成环境或 Visual C+ 程序集成环境六、实验代码#include using namespace std; #include#define ERROR -1#define OK 1#define MAXSIZE 100 /假
3、设该非零元个数的最大值为100 typedef struct int i,j; /该非零元的行下标和列下标 int e; Triple;typedef struct Triple dataMAXSIZE+1; /非零元三元组表,data0未用 int mu,nu,tu; /矩阵的行数、列数和非零元的个数 TSMatrix; typedef int Status;int CreatSMatrix(TSMatrix &M) /创建稀疏矩阵 int i; coutM.muM.nuM.tu; while(M.tuM.mu*M.nu|M.mu1|M.nu1|M.tu1) cout非法输入!n; cout
4、M.muM.nuM.tu; if(M.tuMAXSIZE) return ERROR; for(i=1;i=M.tu;i+) cout请依次输入第iM.datai.iM.datai.jM.datai.e; while(M.datai.iM.mu|M.datai.iM.nu|M.datai.j1|M.datai.e=0) cout输入不合法,请重新输入!n; cout请依次输入第iM.datai.iM.datai.jM.datai.e; return 0; int FastTransposeSMatrix(TSMatrix M,TSMatrix &T) /采用三元组顺序表存储结构表示,求稀疏矩阵
5、M的转置矩阵T。 T.mu=M.nu; T.nu=M.mu; T.tu=M.tu; int col,t,p,q; int *num=(int *)malloc(M.nu*sizeof(int); int *cpot=(int *)malloc(M.nu*sizeof(int); if(T.tu) for(col=1;col=M.nu;+col) numcol=0; for(t=1;t=M.tu;+t)+numM.datat.j;/求M中每一列含非零元个数 cpot1=1; /求第col列中第一个非零元在b.data中的序号 for(col=2;col=M.nu;+col) cpotcol=cp
6、otcol-1+numcol-1; for(p=1;p=M.tu;+p) col=M.datap.j; q=cpotcol; T.dataq.i=M.datap.j; T.dataq.j=M.datap.i; T.dataq.e=M.datap.e; +cpotcol; /for /if return OK; /FastTransposeSMatrix int AddMatrix(TSMatrix a,TSMatrix b,TSMatrix &c) /将矩阵a和矩阵b相加得到矩阵c int i=1,j=1,k=1; int v; if(a.mu!=b.mu|a.nu!=b.nu)/如果行列不相
7、等 return 0; if(a.tu=0&b.tu=0)return 0; c.mu=a.mu; c.nu=a.nu; /c的行列数与a的相同 while (i=a.tu & j=b.tu) /处理a和b中的每个元素 if (a.datai.i=b.dataj.i) /行号相等时 if(a.datai.jb.dataj.j) /a元素的列号大于b元素的列号 c.datak.i=b.datai.i;/将a元素添加到c中 c.datak.j=b.datai.j; c.datak.e=b.datai.e; k+; j+; else /a元素的列号等于b元素的列号 v=a.datai.e+b.dat
8、aj.e; if (v!=0) /只将不为0的结果添加到c中 c.datak.i=a.datai.i; c.datak.j=a.datai.j; c.datak.e=v; k+; i+; j+; else if (a.datai.ib.dataj.i) /a元素的行号小于b元素的行号 c.datak.i=a.datai.i; /将a元素添加到c中 c.datak.j=a.datai.j; c.datak.e=a.datai.e; k+; i+; else /a元素的行号大于b元素的行号 c.datak.i=b.dataj.i; /将b元素添加到c中 c.datak.j=b.dataj.j; c
9、.datak.e=b.dataj.e; k+; j+; while (i=a.tu) /若a中还有元素 /将剩下的元素添加到c中 c.datak.i=a.datai.i; c.datak.j=a.datai.j; c.datak.e=a.datai.e; k+; i+; while (j=b.tu) /若b中还有元素 /将剩下的元素添加到c中 c.datak.i=b.dataj.i; c.datak.j=b.dataj.j; c.datak.e=b.dataj.e; k+; j+; c.tu=k-1; /跳出循环时k多加了一次 cout两稀疏矩阵相加成功!n; return 0;void Sh
10、owSMatrix(TSMatrix M) /输出矩阵M,只输出含非零元的行、列以及元素值 cout遍历结果为:n; cout*n; for(int ii=1;ii=M.mu;ii+) for(int jj=1;jj=M.nu;jj+) int cnt=1; int flag=0; while(cnt=M.tu) if(M.datacnt.i=ii&M.datacnt.j=jj) flag=1; coutM.datacnt.e ; cnt+; if(flag=0) cout0 ; coutendl; cout*n; void menu() cout*n; cout* 稀疏矩阵基本操作 *n;
11、cout*n; cout* 1.转置 *n; cout* 2.相加 *n; cout* 3.遍历 *n; cout* 0.退出 *n; cout*n;cout请输入要选择的选项(0-3):n; int main() TSMatrix A,B,C,D,Q; cout创建A矩阵n; CreatSMatrix(A); couti; while(i) switch(i) case 1: char m1; coutm1; if(m1=A) D=A; else if(m1=B) D=B; else coutERROR!n; return 0; FastTransposeSMatrix(D,C); Show
12、SMatrix(C); break; case 2: AddMatrix(A,B,C); ShowSMatrix(C); break; case 3: char m1; coutm1; if(m1=A) D=A; else if(m1=B) D=B; else coutERROR!n; return 0; ShowSMatrix(D); break; default :couterrorn;break; /输入i值不合法时退出操作并报错 couti; return 0; 七、测试数据及结果整体操作过程:八、思考题1、如何提高矩阵转置算法效率?在上面的代码中我使用的是简单的矩阵转置算法,实际上书
13、上也将了矩阵的快速转置算法。快速转置算法通过添加辅助向量num和cpot,对于稀疏矩阵而言将时间复杂度从O(mu*nu)减为O(nu+tu)。2、如果用十字链表方式表示稀疏矩阵的话,如何来实现矩阵的相加操作呢?书上讲了十字链表的相加操作。主要是花费功夫在链表链接域的指向上。八、心得体会稀疏矩阵的相加算法参考了书上的两线性表的合并算法2.2的思路,即用while循环对每一个非零元进行操作,判断两个非零元的行数、列数相等时进行加和,不同的话根据行、列的大小比较分别加到新的稀疏矩阵中,最后将剩下的非零元加入到新的稀疏矩阵的后面。不过这个算法要求两个稀疏矩阵的datai里的行、列要按非递减排列,因此初始化时要按非递减的输入,有一定的局限性。通过这次实验对稀疏矩阵的存储结构以及转置、相加操作有了一定的了解,加深了对稀疏矩阵操作的理解。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1