题目:
三元组表加法
两个同阶稀疏矩阵A和B分别都采用三元组表示,编写程序求C=A+B,要求C也采用三元组表示。
输入格式
第一行为两个不超过1000的正整数m和n,表示矩阵A和B的非零元素个数,即A和B的三元组表长度。接下来的m行,分别表示矩阵A的m个三元组结点信息,每行3个整数表示每个三元组结点的行号、列号、值。接下来的n行,分别表示矩阵B的n个三元组结点信息,每行3个整数表示每个三元组结点的行号、列号、值。
输出格式
输出矩阵C的三元组表,每个三元组结点一行,同行元素间用空格间隔,每行最后一个元素后面不要加空格。
输入样例:
2 3 1 2 3 2 1 3 1 2 1 2 1 3 2 3 6
输出样例:
1 2 4 2 1 6 2 3 6
代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct _matrix{
int row;
int col;
int value;
}matrix;
int main(){
int m, n;
scanf("%d %d", &m, &n);
matrix* A = (matrix*)malloc(m*sizeof(matrix));
matrix* B = (matrix*)malloc(n*sizeof(matrix));
for(int i = 0; i < m; i++){
scanf("%d %d %d", &A[i].row, &A[i].col, &A[i].value);
}
for(int i = 0; i < n; i++){
scanf("%d %d %d", &B[i].row, &B[i].col, &B[i].value);
}
matrix* C = (matrix*)malloc((m+n)*sizeof(matrix));
int i, j, k;
i = j = k = 0;
while(i < m && j < n){
if(A[i].row < B[j].row){//row min
C[k].row = A[i].row;
C[k].col = A[i].col;
C[k].value = A[i].value;
i++; k++;
}
else if(A[i].row == B[j].row){//row equal
if(A[i].col < B[j].col){// col min
C[k].row = A[i].row;
C[k].col = A[i].col;
C[k].value = A[i].value;
i++; k++;
}
else if(A[i].col == B[j].col){// col equal
if(A[i].value + B[j].value == 0){
i++;j++;
}
else{
C[k].row = A[i].row;
C[k].col = A[i].col;
C[k].value = A[i].value + B[j].value;
i++; j++; k++;
}
}
else if(A[i].col > B[j].col){//col max
C[k].row = B[j].row;
C[k].col = B[j].col;
C[k].value = B[j].value;
j++; k++;
}
}
else if(A[i].row > B[j].row){//row max
C[k].row = B[j].row;
C[k].col = B[j].col;
C[k].value = B[j].value;
j++; k++;
}
}
while(i < m){
C[k] = A[i];
i++; k++;
}
while(j < n){
C[k] = B[j];
j++; k++;
}
for(int i = 0; i < k; i++){
printf("%d %d %d\n", C[i].row, C[i].col, C[i].value);
}
}