《数据结构 课程设计》稀疏矩阵实验报告.docx

上传人:b****5 文档编号:11750277 上传时间:2023-03-31 格式:DOCX 页数:13 大小:42.19KB
下载 相关 举报
《数据结构 课程设计》稀疏矩阵实验报告.docx_第1页
第1页 / 共13页
《数据结构 课程设计》稀疏矩阵实验报告.docx_第2页
第2页 / 共13页
《数据结构 课程设计》稀疏矩阵实验报告.docx_第3页
第3页 / 共13页
《数据结构 课程设计》稀疏矩阵实验报告.docx_第4页
第4页 / 共13页
《数据结构 课程设计》稀疏矩阵实验报告.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

《数据结构 课程设计》稀疏矩阵实验报告.docx

《《数据结构 课程设计》稀疏矩阵实验报告.docx》由会员分享,可在线阅读,更多相关《《数据结构 课程设计》稀疏矩阵实验报告.docx(13页珍藏版)》请在冰豆网上搜索。

《数据结构 课程设计》稀疏矩阵实验报告.docx

《数据结构课程设计》稀疏矩阵实验报告

目录

一、概述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数组中。

2、系统分析

稀疏矩阵的保存:

以一位数组顺序存放非零元素的行号、列号和数值,行号为-1作为结束符。

以三个一维数组存放一个系数矩阵中的一个非零元素,为零额元素则不保存。

用一个二重循环来实现判断每个系数矩阵的非零元素是否为零,不为零,就将其行列下标和其值存入一维数组中

稀疏矩阵的相加:

用循环来判断存储A何B稀疏矩阵的两个一维数组中的行列下标是否相等和其大小关系。

若相等,则将两个一维数组的第三个元素的值相加存入新的数组C里,行列下标不变的存入进去;若A的列小于B的列,则将A的三个元素直接存入C中;若B的列小于A的列,则将B的三个元素村日C中;若A的行小于B的行,则将A的三个元素存入C中;若A的行大于B的行,则将B存入C中。

3、概要设计

(1)主界面的设计:

定义两个矩阵a=00300000b=02000000

0000005000040000

0000000000000600

0000700000008000

0000000000100000

0900000000000000

 

定义两个数组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。

 

(3)具体实现流程图:

 

四、详细设计

(1)稀疏矩阵的转存:

voidCreateMatrix(intA[m][n],intB[50]),这是一个将稀疏矩阵转存的函数,类似于顺序存储三元组表。

在这个方法中,只要用一个二重循环来判断每个矩阵元素是否为零,若不为零,则将其行、列下标及其值存入到一维数组B中对应的元素。

在定义函数的过程中,我们需要定义一个for循环,以完成行和列的转换及存储。

在函数的末尾我们定义一个B[K]=-1,用于结束非零元素的存储。

算法如下:

voidCreateMatrix(intA[m][n],intB[50])

{

inti,j,k=0;

for(i=0;i

for(j=0;j

if(A[i][j]!

=0){

B[k]=i;k++;

B[k]=j;k++;

B[k]=A[i][j];k++;

}

B[k]=-1;

}

(2)稀疏矩阵的相加:

voidMatrixAdd(intA[max],intB[max],intC[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中

if(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、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]

{

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,结束算法。

5、运行与测试

6、总结与心得

在本次试验中,我掌握了稀疏矩阵的存储与转存的相关知识,了解了两个稀疏矩阵的相加后的知识,并实现了稀疏矩阵的加法,明白在计算机中我们对稀疏矩阵的处理,可以很大程度上的节约我们的存储空间,是压缩原理的雏形。

参考文献

【1】《数据结构》严蔚敏.清华大学出版社.

【2】《数据结构课程设计》苏仕华.极械工业出版社.

【3】《程序设计》谭浩强.清华大学出版社.

 

源代码

#include

#definem6

#definen8

#definemax50

//稀疏矩阵存储在数组中

{

inti,j,k=0;

for(i=0;i

for(j=0;j

if(A[i][j]!

=0)

{

B[k]=i;k++;

B[k]=j;k++;

B[k]=A[i][j];k++;

}

B[k]=-1;

}

//两个稀疏矩阵存储到两个数组中后相加存储到另一个数组中

voidmatrixadd(intA[max],intB[max],intC[max])

{

inti=0,j=0,k=0;

while(A[i]!

=-1&&B[j]!

=-1)

{

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;

}

elseif(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;

}

else

{

C[k]=B[j];

C[k+1]=B[j+1];

C[k+2]=B[j+2];

k=k+3;

j=j+3;

}

}

elseif(A[i]

{

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];

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;

}

//主函数

voidmain()

{

intE[m][n],F[m][n],A[max],B[max],C[max];

inti,j,k;

printf("输入稀疏矩阵E(%d,%d):

\n",m,n);

for(i=0;i

for(j=0;j

scanf("%d",&E[i][j]);

printf("输入稀疏矩阵F(%d,%d):

\n",m,n);

for(i=0;i

for(j=0;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;

}

}

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1