稀疏矩阵-加法运算-三元组表表示

//自己写的,亲测有效
#include<stdio.h>
#include<stdlib.h>
typedef struct term {
    
    
	int row; int col;int value;
}Term;

//一定要保证两个三元组表所代表的矩阵的行数和列数相等,即形状是一样的。
Term* Add2Triples(Term* elem1, int len1, Term* elem2, int len2){
    
    
	int lenTerm1=len1;
	int lenTerm2=len2;
	int* z = (int*)malloc((sizeof(int))*(lenTerm1+lenTerm1));
	Term* elemResult=(Term*)malloc((sizeof(Term))*(lenTerm1+lenTerm1));
	int i,j;
	
	for(i=0;i<lenTerm1;i++){
    
    
		for(j = 0; j < lenTerm2;j++){
    
    
			if((elem2[j].col==elem1[i].col)&&(elem2[j].row==elem1[i].row)){
    
    
				z[j]=j;
				elem1[i].value=elem1[i].value+elem2[j].value;
			}
		}
	}
	for(i=0;i<lenTerm1;i++){
    
    
		elemResult[i].col=elem1[i].col;
		elemResult[i].row=elem1[i].row;
		elemResult[i].value=elem1[i].value;
	}
	for(i=0;i<lenTerm2;i++){
    
    
		if(z[i]!=i){
    
    
			elemResult[lenTerm1].col=elem2[i].col;
			elemResult[lenTerm1].row=elem2[i].row;
			elemResult[lenTerm1].value=elem2[i].value;
			lenTerm1++;
		}
	}
	return elemResult;
}
void main() {
    
    
	int a[5][6]={
    
    0} ;
	int b[5][6]={
    
    0} ;
	int c[5][6]={
    
    0} ;
	Term* elemResult;
	int i,j ;
	Term elem1[7] = {
    
    {
    
     0,0,15},
	{
    
     0,2,22 },
	{
    
     0,5,-15 },
	{
    
     1,1,11 },
	{
    
     2,2,3 },
	{
    
     3,3,-6 },
	{
    
     4,0,91 }};
	Term elem2[8] = {
    
    {
    
     0,0,45},
	{
    
     0,3,4 },
	{
    
     0,4,1 },
	{
    
     1,1,19 },
	{
    
     1,3,2 },
	{
    
     2,2,22 },
	{
    
     3,0,4 },
	{
    
     4,5,1 }};
	int lenTerm1=sizeof(elem1)/sizeof(Term);
	int lenTerm2=sizeof(elem2)/sizeof(Term);
	for (i = 0; i < lenTerm1;i++) {
    
    
		a[elem1[i].row][elem1[i].col] = elem1[i].value;
	}
	for (i = 0; i < lenTerm2;i++) {
    
    
		b[elem2[i].row][elem2[i].col] = elem2[i].value;
	}
	for (i = 0; i < 5;i++) {
    
    
		for (j = 0; j < 6;j++) {
    
    
			printf("%5d ",a[i][j]);

		}
		printf("\n");
	}
	printf("\n");
	for (i = 0; i < 5;i++) {
    
    
		for (j = 0; j < 6;j++) {
    
    
			printf("%5d ",b[i][j]);

		}
		printf("\n");
	}
	elemResult=  Add2Triples(elem1,lenTerm1,elem2,lenTerm2);
	printf("\n");
	printf("\n");
	for(i = 0; i <lenTerm1+lenTerm2;i++){
    
    
		if(elemResult[i].row >-1){
    
    
			printf("%5d %5d %5d \n",elemResult[i].row,elemResult[i].col,elemResult[i].value);
			c[elemResult[i].row][elemResult[i].col] = elemResult[i].value;
		}
	}
	printf("\n");
	printf("\n");
	for (i = 0; i < 5;i++) {
    
    
		for (j = 0; j < 6;j++) {
    
    
			printf("%5d ",c[i][j]);

		}
		printf("\n");
	}
	system("pause");
}

猜你喜欢

转载自blog.csdn.net/m0_47472749/article/details/121494900