《数据结构 课程设计》稀疏矩阵实验报告
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(2)稀疏矩阵的相加:
void MatrixAdd(int A[max],int B[max],int C[max]),这个函数用 于实现数组A和数组B的相加,并将其相加的结果存入数组C。这个函数 讨论了数组在相加的过程中的几种情况: a、 A数组和B数组的行相等且列相等,两者直接相加后存入数组C中。 if(A[i]==B[j]) { if(A[i+1]==B[j+1]) { C[k]=A[i]; C[k+1]=A[i+1]; C[k+2]=A[i+2]+B[j+2]; k=k+3; i=i+3; j=j+3; } } b、A的列小于B的列,将A的三个元素直接存入C中
2、 系统分析
稀疏矩阵的保存:以一位数组顺序存放非零元素的行号、列号和数 值,行号为-1作为结束符。以三个一维数组存放一个系数矩阵中的一个 非零元素,为零额元素则不保存。用一个二重循环来实现判断每个系数
矩阵的非零元素是否为零,不为零,就将其行列下标和其值存入一维数 组中 稀疏矩阵的相加:用循环来判断存储A何B稀疏矩阵的两个一维数组 中的行列下标是否相等和其大小关系。若相等,则将两个一维数组的第 三个元素的值相加存入新的数组C里,行列下标不变的存入进去;若A的 列小于B的列,则将A的三个元素直接存入C中;若B的列小于A的列,则 将B的三个元素村日C中;若A的行小于B的行,则将A的三个元素存入C 中;若A的行大于B的行,则将B存入C中。
3、 概要设计
(1)主界面的设计:
定义两个矩阵a= 0 0 0 0 0 0 0 0 0 0 0 9 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 0 0 0 0 0 0 0 0 0 5 0 0 0 0 0 0 0 0 0 0 b= 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 1 0 0 4 0 0 0 0 0 0 0 8 0 0 0 0 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
for(i=0;i<m;i++)//输入稀疏矩阵F for(j=0;j<n;j++) scanf("%d",&F[i][j]); creatematrix(E,A);// E稀疏矩阵存储在数组A中 creatematrix(F,B);// F稀疏矩阵存储在数组B中 matrixadd(A,B,C);//相加 i=0;j=0;k=0; printf("A数组内容如下:\n"); while(A[i]!=-1) { printf("%5d,%5d,%5d\n",A[i],A[i+1],A[i+2]); i=i+3; } printf("B数组内容如下:\n"); while(B[j]!=-1) { printf("%5d,%5d,%5d\n",B[j],B[j+1],B[j+2]); j=j+3; } printf("C数组内容如下:\n"); while(C[k]!=-1) { printf("%5d,%5d,%5d\n",C[k],C[k+1],C[k+2]); k=k+3; }
目
一、概述 1 二、 系统分析 1 三、 概要设计 1 (1)主界面的设计: 2 (2)系数矩阵的存储 2 (3)具体实现流程图: 3 四、详细设计 4 (2)稀疏矩阵的相加: 5 五、 运行与测试 8 六、 总结与心得 8 参考文献 9 源代码 9
录
一、概述
稀疏矩阵的加法运算,既将稀疏矩阵A和B,他均为m行n列,分别以 数组的形式存放在A和B中,实现A+B=C,将所得的结果存放在C数组中。
5、 运行与测试
6、 总结与心得
在本次试验中,我掌握了稀疏矩阵的存储与转存的相关知识,了解 了两个稀疏矩阵的相加后的知识,并实现了稀疏矩阵的加法,明白在计 算机中我们对稀疏矩阵的处理,可以很大程度上的节约我们的存储空 间,是压缩原理的雏形。
参考文献
【1】《数据结构》严蔚敏.清华大学出版社. 【2】《数据结构课程设计》苏仕华.极械工业出版社. 【3】《程序设计》谭浩强 .清华大学出版社.
源代码
#include <stdio.h> #define m 6 #define n 8 #define max 50 // 稀疏矩阵存储在数组中 { int i,j,k=0; for(i=0;i<m;i++) for(j=0;j<n;j++) if (A[i][j]!=0) { B[k]=i; k++; B[k]=j; } B[k]=-1; } //两个稀疏矩阵存储到两个数组中后相加存储到另一个数组中 void matrixadd(int A[max],int B[max],int C[max]) { int i=0,j=0,k=0; while (A[i]!=-1&&B[j]!=-1) { if (A[i]==B[j]) { k++; k++; B[k]=A[i][j];
if(A[i+1]<B[j+1]) { C[k]=A[i]; C[k+1]=A[i+1]; C[k+2]=A[i+2]; k=k+3; i=i+3; } c、B的列小于A的列,将B的三个元素直接存入C中 if(A[i+1]>B[j+1]) { C[k]=B[j]; C[k+1]=B[j+1]; C[k+2]=B[j+2]; k=k+3; j=j+3; } d、A的行小于B的行,将A的三个元素直接存入C中 if(A[i]<B[j]) { C[k]=A[i]; C[k+1]=A[i+1]; C[k+2]=A[i+2]; k=k+3; i=i+3; } e、B的行小于A的行,将B的三个元素直接存入C中 if(A[i]>B[j]) { C[k]=B[j]; C[k+1]=B[j+1]; C[k+2]=B[j+2]; k=k+3; j=j+3; } f、A结束B还有元素,将B的所有元素直接存入C中
if(A[i]==-1) while(B[j]!=-1) { C[k]=B[j]; C[k+1]=B[j+1]; C[k+2]=B[j+2]; k=k+3; j=j+3; } g、B结束A还有元素,将A的所有元素直接存入C中 if(B[i]==-1) while(A[i]!=-1) { C[k]=A[i]; C[k+1]=A[i+1]; C[k+2]=A[i+2]; k=k+3; i=i+3;} 最后定义C[k]=-1,结束算法。
if (A[i+1]==B[j+1]) { C[k]=A[i]; C[k+1]=A[i+1]; C[k+2]=A[i+2]+B[j+2]; k=k+3; i=i+3; j=j+3; } else if (A[i+1]<B[j+1]) { C[k]=A[i]; C[k+1]=A[i+1]; C[k+2]=A[i+2]; k=k+3; i=i+3; } else { C[k]=B[j]; C[k+1]=B[j+1]; C[k+2]=B[j+2]; k=k+3; j=j+3; }
} else if (A[i]<B[j]) { C[k]=A[i]; C[k+1]=A[i+1]; C[k+2]=A[i+2]+B[j+2]; k=k+3; i=i+3; } else { C[k]=B[j]; C[k+1]=B[j+1]; C[k+2]=B[j+2]; k=k+3; j=j+3; } } if (A[i]==-1) { while (B[j]!=-1) { C[k]=B[j]; C[k+1]=B[j+1]; C[k+2]=B[j+2];来自(3)具体实现流程图:
四、详细设计
(1)稀疏矩阵的转存:
void CreateMatrix(int A[m][n],int B[50]),这是一个将稀疏矩 阵转存的函数,类似于顺序存储三元组表。在这个方法中,只要用一个 二重循环来判断每个矩阵元素是否为零,若不为零,则将其行、列下标
及其值存入到一维数组B中对应的元素。在定义函数的过程中,我们需 要定义一个for循环,以完成行和列的转换及存储。在函数的末尾我们 定义一个B[K]=-1,用于结束非零元素的存储。 算法如下: void CreateMatrix(int A[m][n],int B[50]) { int i,j,k=0; for(i=0;i<m;i++) for(j=0;j<n;j++) if(A[i][j]!=0){ B[k]=i;k++; B[k]=j;k++; B[k]=A[i][j];k++; } B[k]=-1; }
定义两个数组A和B,用于存储矩阵a和矩阵b的值;定义一个数组 C,用于存放数组A和数组B相加后的结果。
(2)系数矩阵的存储
用一维数组存放系数矩阵A如下:A[0]=0,A[1]=2, A[2]=3, A[3]=1, A[4]=6, A[5]=5, A[6]=3, A[7]=4, A[8]=7, A[9]=5, A[10]=1, A[11]=9, A[12]=-1。 用一维数组存放系数矩阵B如下:B[0]=0,B[1]=1,B[2]=2, B[3]=1,B[4]=3, B[5]=4, B[6]=2, B[7]=5, B[8]=6, B[9]=3, B[10]=4, B[11]=8, B[12]=4,B[13]=2,B[14]=1,B[15]=-1。
}
k=k+3;j=j+3;} } else { while(A[i]!=-1) { C[k]=A[i]; C[k+1]=A[i+1]; C[k+2]=A[i+2]; k=k+3; i=i+3; } } C[k]=-1; } //主函数 void main() { int E[m][n],F[m][n],A[max],B[max],C[max]; int i,j,k; printf("输入稀疏矩阵E(%d,%d):\n",m,n); for(i=0;i<m;i++) //输入稀疏矩阵E for(j=0;j<n;j++) scanf("%d",&E[i][j]); printf("输入稀疏矩阵F(%d,%d):\n",m,n);