两个同阶稀疏矩阵 A 和 B 分别都采用三元组表示,编写程序求 C = A - B,要求 C 也采用三元组表示。
输入格式:
第一行为两个不超过1000的正整数 m 和 n,表示矩阵 A 和 B 的非零元素个数,即 A 和 B 的三元组表长度。接下来的 m 行,分别表示矩阵 A 的 m 个三元组结点信息,每行3个整数表示每个三元组结点的行号、列号、值。接下来的 n 行,分别表示矩阵 B 的 n 个三元组结点信息,每行3个整数表示每个三元组结点的行号、列号、值。
输出格式:
输出矩阵 C 的三元组表,每个三元组结点一行,同行元素间用空格间隔,每行最后一个元素后面不要加空格。
输入样例:
3 2
1 2 3
2 1 8
2 3 6
1 2 1
2 1 3
输出样例:
1 2 2
2 1 5
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); //输入矩阵A和B的非零元个数
matrix* A = (matrix*)malloc(m*sizeof(matrix)); //给行和列分配空间
matrix* B = (matrix*)malloc(n*sizeof(matrix));
for(int i = 0; i < m; i++){ //输入3个整数,分别表示A的每个结点的行号、列号、值
scanf("%d %d %d", &A[i].row, &A[i].col, &A[i].value);
}
for(int i = 0; i < n; i++){ //输入3个整数,分别表示B的每个结点的行号、列号、值
scanf("%d %d %d", &B[i].row, &B[i].col, &B[i].value);
}
matrix* C = (matrix*)malloc((m+n)*sizeof(matrix)); //给C分配空间
int i, j, k;
i = j = k = 0;
while(i < m && j < n){
if(A[i].row < B[j].row){ //如果A[i]的行号小于B[j]的行号,则C[k]的行、列、值都与A[i]的相等
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){ //如果A[i]的行号等于B[j]的行号
if(A[i].col < B[j].col){ // 如果A[i]的列号小于B[j]的列号
C[k].row = A[i].row;
C[k].col = A[i].col;
C[k].value = A[i].value;
i++; k++; //C[k]的行、列、值都与A[i]的相等
}
else if(A[i].col == B[j].col){ // 如果A[i]的列号等于B[j]的列号
if(A[i].value - B[j].value == 0){ //如果值相等,C[k].value的值为0
i++;j++;
}
else{ //如果两个值不相等,行号和列号与A相等,value的值为A[i].value - B[j].value
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){ //如果A[i]的行号等于B[j]的行号且A[i]的列号大于B[j]的列号,则C[k]的行、列、值都与B[j]的相等
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){ //如果A[i]的行号大于B[j]的行号,则C[k]的行、列、值都与B[i]的相等
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++){ //打印输出C=A-B的值
printf("%d %d %d\n", C[i].row, C[i].col, C[i].value);
}
}