稀疏矩阵(C语言描述)

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
else if(A->data[x].i>B->data[y].i) {
Result->data[z].i=B->data[y].i ; Result->data[z].j=B->data[y].j ; Result->data[z].e=0-B->data[y].e ; y++; z++; } if(y>=B->tu) break ; }
Result->data[z].i=B->data[y].i ; Result->data[z].j=B->data[y].j ; Result->data[z].e=0-B->data[y].e ; y++; z++; } else if(A->data[x].j==B->data[y].j) { if((Result->data[z].e=A->data[x].e-B->data[y].e)!=0) {
transpose(RLSMatrix M) 初始条件:稀疏矩阵 M 存在 操作结果:求稀疏矩阵 M 的转置矩阵.
value(RLSMatrix M,int m,int n) 初始条件:稀疏矩阵 M 存在. 操作结果:求出三元组存储中第 m 行第 n 列的数值.
print1(RLSMatrix M) 初始条件:稀疏矩阵 M 存在. 操作结果:按矩阵的形式输出
if(x<=A->tu) {
while(x<=A->tu) {
Result->data[z].i=A->data[x].i ; Result->data[z].j=A->data[x].j ; Result->data[z].e=A->data[x].e ; x++; z++; } } if(y<=B->tu) {

0 10
+
-2 3
4 -3 0 0 1 00080 00100 0 0 0 0 70
300
420
×
010
+
100
=
000
0 -6 0
800

010
000
5.程序执行命令为: 1)加法命令 A 2)减法命令 B 3)乘法命令 C
二:概要设计
1 抽象数据类型稀疏矩阵的定义如下: ADT SparseMatrix { 数据对象:D={aij| i = 1,2,3,….,m; j =1,2,3,……,n; a i,j∈ElemSet,m 和 n 分别称为矩阵的行数和列数 } 数据关系 : R={ Row , Col } Row ={<ai,j ,ai,j+1> | 1≤ i≤m , 1≤ j≤ n-1} Col ={<a i,j , a i+1,j >| 1≤i≤m-1,1≤j≤n}
基本操作:
第 1 页 共 12 页
-=数据结构试验报告=-
系数矩阵运算器
creat( ) 操作结果:以一个二维数组创建稀疏矩阵,用三元组来存储.
add(RLSMatrix M , RLSMatrix N) 初始条件:稀疏矩阵 M 与 N 的行数与列数对应相等. 操作结果:求得一个矩阵和.
jian(RLSMatrix a,RLSMatrix b) 初始条件:稀疏矩阵 M 与 N 的行数与列数对应相等. 操作结果:求得一个矩阵差.
//矩阵减法实现主模块
{
void PRINTF(RLSMatrix*Result); Result->tu=0 ; Result->mu=A->mu ; Result->nu=A->nu ; int x=1 ; int y=1 ; int z=1 ;
while(x<=A->tu) {
if(A->data[x].i<BΒιβλιοθήκη Baidu>data[y].i) {
第 6 页 共 12 页
系数矩阵运算器
-=数据结构试验报告=-
while(y<=B->tu) {
Result->data[z].i=B->data[y].i ; Result->data[z].j=B->data[y].j ; Result->data[z].e=0-B->data[y].e ; y++; z++; } }
Result->data[z].i=A->data[x].i ; Result->data[z].j=A->data[x].j ; x++; y++; z++; } else { x++;
第 3 页 共 12 页
-=数据结构试验报告=-
y++; } } else if(A->data[x].j<B->data[y].j) { Result->data[z].i=A->data[x].i ; Result->data[z].j=A->data[x].j ; Result->data[z].e=A->data[x].e ; x++; z++; } } else if(A->data[x].i>B->data[y].i) { Result->data[z].i=B->data[y].i ; Result->data[z].j=B->data[y].j ; Result->data[z].e=B->data[y].e ; y++; z++; } if(y>=B->tu) break ; } //while if(x<=A->tu) { while(x<=A->tu) { Result->data[z].i=A->data[x].i ; Result->data[z].j=A->data[x].j ; Result->data[z].e=A->data[x].e ; x++; z++; } } if(y<=B->tu) { while(y<=B->tu) { Result->data[z].i=B->data[y].i ; Result->data[z].j=B->data[y].j ; Result->data[z].e=B->data[y].e ; y++; z++; } }
//矩阵加法实现主模块
第 2 页 共 12 页
-=数据结构试验报告=-
系数矩阵运算器
void ADD(RLSMatrix*A,RLSMatrix*B,RLSMatrix*Result) {
void PRINTF(RLSMatrix*Result); int x=1 ; int y=1 ; int z=1 ;
mutitu(RLSMatrix M,RLSMatrix N) 初始条件:稀疏矩阵 M 的列数和 N 的行数对应相等. 操作结果:求得两矩阵的积.
print(RLSMatrix a) 初始条件:稀疏矩阵 M 存在. 操作结果:按三元存储形式输出. }A DT Glist
三:详 细 设 计
1:稀疏矩阵运算器程序如下: #include "stdio.h" #include "stdlib.h" #define MAXSIZE 30 #define MAXRC 30
Result->tu=0 ; Result->mu=A->mu ; Result->nu=A->nu ;
while(x<=A->tu) {
if(A->data[x].i<B->data[y].i) {
Result->data[z].i=A->data[x].i ; Result->data[z].j=A->data[x].j ; Result->data[z].e=A->data[x].e ; x++; z++; }
brow=A->data[p].j ; if(brow<B->mu)
第 7 页 共 12 页
第 5 页 共 12 页
-=数据结构试验报告=-
Result->data[z].i=A->data[x].i ; Result->data[z].j=A->data[x].j ; x++; y++; z++; } else { x++; y++; } } else if(A->data[x].j<B->data[y].j) { Result->data[z].i=A->data[x].i ; Result->data[z].j=A->data[x].j ; Result->data[z].e=A->data[x].e ; x++; z++; } }
第 4 页 共 12 页
系数矩阵运算器
-=数据结构试验报告=-
系数矩阵运算器
Result->tu=z ; printf("矩阵 A 为:\n");
PRINTF(A); printf("矩阵 B 为:\n");
PRINTF(B); printf("矩阵相减结果为:\n");
PRINTF(Result); } 3.矩阵减法实现主模块 void SUB(RLSMatrix*A,RLSMatrix*B,RLSMatrix*Result)
else if(A->data[x].i==B->data[y].i) {
if(A->data[x].j>B->data[y].j) {
Result->data[z].i=B->data[y].i ; Result->data[z].j=B->data[y].j ; Result->data[z].e=B->data[y].e ; y++; z++; } else if(A->data[x].j==B->data[y].j) { if((Result->data[z].e=A->data[x].e+B->data[y].e)!=0) {
3.本程序只对两个矩阵进行四则运算,所的结果矩阵应该另生成,用二维数组存放,并放入 新的矩阵中,只要对矩阵求解就能求出答案.
4.测试数据(附后).
10 0 0 0 09
-1 0 0

000 0 0 -1
=
1 0 -3
10 0 0 008 1 0 -3
10 0 09 -1 0
00

0 -1
1 -3
10 0
-=数据结构试验报告=-
系数矩阵运算器
数据结构试验报告
题目:编制一个稀疏矩阵基本运算的运算器
一:需求分析
1.按照压缩存储的概念,只存储稀疏矩阵的非零元,以两个三元组{i,j,e}来表示矩阵的非 零元的行,列和数值,就确定了一个非零元.由此,稀疏矩阵可由表示非零元的三元数组 及行列数确定.
2.用户输入数据作为三元组的行,列和非零元的个数,用逗号隔开.并输入非零元的行,列 和数值.
//头函数
typedef struct {
int i,j ; int e ; } Triple ;
//定义结构
typedef struct {
Triple data[MAXSIZE+1]; int rpos[MAXRC+1]; int mu,nu,tu ; }RLSMatrix ; 2 .阵加法实现主模块 void ADD(RLSMatrix*A,RLSMatrix*B,RLSMatrix*Result)
for(arow=1;arow<=A->mu;++arow) {
for(i=1;i<=Result->nu;i++) ctemp[i]=0 ;
Result->rpos[arow]=Result->tu+1 ; if(arow<A->mu) tp=A->rpos[arow+1]; else tp=A->tu+1 ; for(p=A->rpos[arow];p<tp;++p) {
Result->tu=z ; printf("矩阵 A 为:\n"); PRINTF(A); printf("矩阵 B 为:\n"); PRINTF(B); printf("矩阵相加结果为:\n"); PRINTF(Result); }
4.乘法实现主模块 void MUL(RLSMatrix*A,RLSMatrix*B,RLSMatrix*Result) {
void PRINTF(RLSMatrix*Result);
int ctemp[MAXRC]; int tp,p,t,arow,brow,q,ccol,i ;
Result->mu=A->mu ; Result->nu=B->nu ; Result->tu=0 ; if(A->tu*B->tu!=0) {
Result->data[z].i=A->data[x].i ; Result->data[z].j=A->data[x].j ; Result->data[z].e=A->data[x].e ; x++; z++; }
else if(A->data[x].i==B->data[y].i) {
if(A->data[x].j>B->data[y].j) {
相关文档
最新文档