稀疏矩陣加法,實現C=A+B
阿新 • • 發佈:2019-01-03
輸入兩個稀疏矩陣,輸出它們相加的結果。 |
第一行輸入四個正整數,分別是兩個矩陣的行m、列n、第一個矩陣的非零元素的個數t1和第二個矩陣的非零元素的個數t2。 接下來的t1+t2行是三元組,分別是第一個矩陣的資料和第二個矩陣的資料。三元組的第一個元素表示行號,第二個元素表示列號,第三個元素是該項的值。 |
輸出相加後的矩陣三元組。 |
3 4 3 2 1 1 1 1 3 1 2 2 2 1 2 1 2 2 3 |
1 1 1 1 2 1 1 3 1 2 2 5 |
#include <stdio.h> #include <stdlib.h> #define MAXSIZE 10000 typedef struct { int row,col,e; }Triple; typedef struct { Triple data[MAXSIZE+1]; int m,n,len; }TSMatrix; void InitTriple(TSMatrix *Q) { Q->m=100; Q->n=100; Q->len=0; } void EnterTriple(TSMatrix *Q,int row,int col,int e) { Q->len++; Q->data[Q->len].row=row; Q->data[Q->len].col=col; Q->data[Q->len].e=e; } void PutTriple(TSMatrix *Q) { int i; for(i=1;i<Q->len;i++) { printf("%d %d %d\n",Q->data[i].row,Q->data[i].col,Q->data[i].e); } printf("%d %d %d",Q->data[i].row,Q->data[i].col,Q->data[i].e); } void SumTriple(TSMatrix *A,TSMatrix *B,TSMatrix *C) { int i=1,j=1; while(i<=A->len&&j<=B->len) { if(A->data[i].row<B->data[j].row) { EnterTriple(C,A->data[i].row,A->data[i].col,A->data[i].e); i++; } else if(A->data[i].row==B->data[j].row) { if(A->data[i].col<B->data[j].col) { EnterTriple(C,A->data[i].row,A->data[i].col,A->data[i].e); i++; } else if(A->data[i].col>B->data[j].col) { EnterTriple(C,B->data[j].row,B->data[j].col,B->data[j].e); j++; } else { if(B->data[j].e+A->data[i].e!=0) EnterTriple(C,B->data[j].row,B->data[j].col,B->data[j].e+A->data[i].e); i++; j++; } } else { EnterTriple(C,B->data[j].row,B->data[j].col,B->data[j].e); j++; } } while(i<=A->len) { EnterTriple(C,A->data[i].row,A->data[i].col,A->data[i].e); i++; } while(j<=B->len) { EnterTriple(C,B->data[j].row,B->data[j].col,B->data[j].e); j++; } } int main() { int n,m,i,row,col,e,h,l; TSMatrix A,B,C; scanf("%d%d%d%d",&h,&l,&n,&m); InitTriple(&A); InitTriple(&B); InitTriple(&C); for(i=0;i<n;i++) { scanf("%d%d%d",&row,&col,&e); EnterTriple(&A,row,col,e); } for(i=0;i<m;i++) { scanf("%d%d%d",&row,&col,&e); EnterTriple(&B,row,col,e); } SumTriple(&A,&B,&C); PutTriple(&C); return 0; }