三元组存储稀疏矩阵的加法

加法

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

  

结果正如意料!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值