加法
typedef int BOOL;
typedef int ElemType ;
typedef struct Triple{
int i, j;
ElemType e;
}triple;
typedef struct matrix{
triple data[MAXSIZE];
int m, n, num; //行数、列数、非零元个数
}TSMatrix;
BOOL TSMatrix_Add(TSMatrix A, TSMatrix B, TSMatrix *C){
int row_A, col_A; //A矩阵的元素行、列号
int row_B, col_B; //A矩阵的元素行、列号
int index_A, index_B, index_C; //A、B、C矩阵对应的三元组下标
if(!(A.m==B.m && A.n==B.n && C->m==A.m && C->n==A.n)) return ERROR; //检查A、B、C是否为同型矩阵
for(index_A = 0,index_B = 0,index_C = 0;(index_A < A.num) && (index_B < B.num);) /*遍历A、B对应三元组,一旦其中一个的元素取完则结束循环*/
{
row_A=A.data[index_A].i;
col_A=A.data[index_A].j;
row_B=B.data[index_B].i;
col_B=B.data[index_B].j;
if(row_A>row_B){ //B行号比A小此时可将B元素赋值给C
C->data[index_C].i=B.data[index_B].i;
C->data[index_C].j=B.data[index_B].j;
C->data[index_C].e=B.data[index_B].e;
index_B++;
index_C++;
}
else if(row_B>row_A){ //同理A行号比B小此时可将A元素赋值给C
C->data[index_C].i=A.data[index_A].i;
C->data[index_C].j=A.data[index_A].j;
C->data[index_C].e=A.data[index_A].e;
index_A++;
index_C++;
}
else if(row_A==row_B)
{ //A与B行号相同时
if(col_A==col_B){ //列号也相同时
C->data[index_C].i=A.data[index_A].i;
C->data[index_C].j=A.data[index_A].j;
C->data[index_C].e=A.data[index_A].e + B.data[index_B].e;
index_A++;
index_B++;
index_C++;
}
else if(col_A>col_B){ //B列号比A小此时可将B元素赋值给C
C->data[index_C].i=B.data[index_B].i;
C->data[index_C].j=B.data[index_B].j;
C->data[index_C].e=B.data[index_B].e;
index_B++;
index_C++;
}
else if(col_A<col_B){ //A列号比B小此时可将A元素赋值给C
C->data[index_C].i=A.data[index_A].i;
C->data[index_C].j=A.data[index_A].j;
C->data[index_C].e=A.data[index_A].e;
index_A++;
index_C++;
}
}
}
while(index_A<A.num){ //A没取完可将A元素直接赋值给C对应元素
C->data[index_C].i=A.data[index_A].i;
C->data[index_C].j=A.data[index_A].j;
C->data[index_C].e=A.data[index_A].e;
index_A++;
index_C++;
}
while(index_B<B.num){ //B没取完可将B元素直接赋值给C对应元素
C->data[index_C].i=B.data[index_B].i;
C->data[index_C].j=B.data[index_B].j;
C->data[index_C].e=B.data[index_B].e;
index_B++;
index_C++;
}
C->num=index_C; //由于执行循环后index_C加1,所以index_C代表C中非零元个数
return OK;
}
演示代码
#include <stdio.h>
#define OK 1
#define ERROR 0
#define MAXSIZE 20
typedef int BOOL;
typedef int ElemType ;
typedef struct Triple{
int i, j;
ElemType e;
}triple;
typedef struct matrix{
triple data[MAXSIZE];
int m, n, num; //行数、列数、非零元个数
}TSMatrix;
BOOL TSMatrix_Add(TSMatrix A, TSMatrix B, TSMatrix *C){
int row_A, col_A; //A矩阵的元素行、列号
int row_B, col_B; //A矩阵的元素行、列号
int index_A, index_B, index_C; //A、B、C矩阵对应的三元组下标
if(!(A.m==B.m && A.n==B.n && C->m==A.m && C->n==A.n)) return ERROR; //检查A、B、C是否为同型矩阵
for(index_A = 0,index_B = 0,index_C = 0;(index_A < A.num) && (index_B < B.num);) /*遍历A、B对应三元组,一旦其中一个的元素取完则结束循环*/
{
row_A=A.data[index_A].i;
col_A=A.data[index_A].j;
row_B=B.data[index_B].i;
col_B=B.data[index_B].j;
if(row_A>row_B){ //B行号比A小此时可将B元素赋值给C
C->data[index_C].i=B.data[index_B].i;
C->data[index_C].j=B.data[index_B].j;
C->data[index_C].e=B.data[index_B].e;
index_B++;
index_C++;
}
else if(row_B>row_A){ //同理A行号比B小此时可将A元素赋值给C
C->data[index_C].i=A.data[index_A].i;
C->data[index_C].j=A.data[index_A].j;
C->data[index_C].e=A.data[index_A].e;
index_A++;
index_C++;
}
else if(row_A==row_B)
{ //A与B行号相同时
if(col_A==col_B){ //列号也相同时
C->data[index_C].i=A.data[index_A].i;
C->data[index_C].j=A.data[index_A].j;
C->data[index_C].e=A.data[index_A].e + B.data[index_B].e;
index_A++;
index_B++;
index_C++;
}
else if(col_A>col_B){ //B列号比A小此时可将B元素赋值给C
C->data[index_C].i=B.data[index_B].i;
C->data[index_C].j=B.data[index_B].j;
C->data[index_C].e=B.data[index_B].e;
index_B++;
index_C++;
}
else if(col_A<col_B){ //A列号比B小此时可将A元素赋值给C
C->data[index_C].i=A.data[index_A].i;
C->data[index_C].j=A.data[index_A].j;
C->data[index_C].e=A.data[index_A].e;
index_A++;
index_C++;
}
}
}
while(index_A<A.num){ //A没取完可将A元素直接赋值给C对应元素
C->data[index_C].i=A.data[index_A].i;
C->data[index_C].j=A.data[index_A].j;
C->data[index_C].e=A.data[index_A].e;
index_A++;
index_C++;
}
while(index_B<B.num){ //B没取完可将B元素直接赋值给C对应元素
C->data[index_C].i=B.data[index_B].i;
C->data[index_C].j=B.data[index_B].j;
C->data[index_C].e=B.data[index_B].e;
index_B++;
index_C++;
}
C->num=index_C; //由于执行循环后index_C加1,所以index_C代表C中非零元个数
return OK;
}
void display(TSMatrix M){ //由三元组打印出矩阵
int i, j;
for(i=1;i<=M.m;i++){
for(j=1;j<=M.n;j++){
int value =0;
int k;
for(k=0;k<M.num;k++){
if(i == M.data[k].i && j == M.data[k].j){
printf("%d ",M.data[k].e);
value =1;
break;
}
}
if(value == 0)
printf("0 ");
}
printf("\n");
}
}
int main() {
TSMatrix M, N, C;
//定义三行三列的矩阵并赋初值
M.m=3; M.n=3;
M.num=3;
M.data[0].i=1; M.data[0].j=1; M.data[0].e=1;
M.data[1].i=3; M.data[1].j=2; M.data[1].e=2;
M.data[2].i=2; M.data[2].j=2; M.data[2].e=8;
C.m=3; C.n=3;
C.num=3;
C.data[0].i=0; C.data[0].j=0; C.data[0].e=0;
C.data[1].i=0; C.data[1].j=0; C.data[1].e=0;
C.data[2].i=0; C.data[2].j=0; C.data[2].e=0;
N.m=3; N.n=3;
N.num=3;
N.data[0].i=1; N.data[0].j=1; N.data[0].e=1;
N.data[1].i=2; N.data[1].j=3; N.data[1].e=5;
N.data[2].i=3; N.data[2].j=1; N.data[2].e=3;
TSMatrix_Add(M,N,&C);
display(M);
printf("+\n");
display(N);
printf("=\n");
display(C);
return 0;
}
结果正如意料!