用C++编写程序请采用三元组的存储表示稀疏矩阵,实现2个稀疏矩阵的加法运算.样例输入:3 4 3 0 1 1 1 2 2 2 1 3 3 4 3 0 2 1 1 3 3 2 1 2。样例输出:0 1 1 0 0 0 2 3 0 5 0 0
时间: 2024-05-04 12:17:34 浏览: 128
稀疏矩阵的加法,c++实现
3星 · 编辑精心推荐
好的,我可以帮你解决这个问题。以下是实现代码:
```c
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
typedef struct {
int row, col, value;
}Triple;
typedef struct {
Triple data[MAXSIZE + 1];
int rows, cols, nums;
}TSMatrix;
void CreateTSMatrix(TSMatrix *M) {
printf("请输入矩阵的行数、列数和非零元素个数:\n");
scanf("%d%d%d", &M->rows, &M->cols, &M->nums);
printf("请输入矩阵的三元组表:\n");
for(int i = 1; i <= M->nums; i++) {
scanf("%d%d%d", &M->data[i].row, &M->data[i].col, &M->data[i].value);
}
}
void PrintTSMatrix(TSMatrix M) {
int k = 1;
for(int i = 1; i <= M.rows; i++) {
for(int j = 1; j <= M.cols; j++) {
if(i == M.data[k].row && j == M.data[k].col) {
printf("%d ", M.data[k].value);
k++;
} else {
printf("0 ");
}
}
printf("\n");
}
}
void AddTSMatrix(TSMatrix M1, TSMatrix M2, TSMatrix *M3) {
if(M1.rows != M2.rows || M1.cols != M2.cols) {
printf("两个矩阵的行数或列数不相等,无法相加!\n");
return;
}
int i = 1, j = 1, k = 1;
while(i <= M1.nums && j <= M2.nums) {
if(M1.data[i].row < M2.data[j].row || (M1.data[i].row == M2.data[j].row && M1.data[i].col < M2.data[j].col)) {
M3->data[k] = M1.data[i];
i++, k++;
} else if(M1.data[i].row == M2.data[j].row && M1.data[i].col == M2.data[j].col) {
M3->data[k].row = M1.data[i].row;
M3->data[k].col = M1.data[i].col;
M3->data[k].value = M1.data[i].value + M2.data[j].value;
i++, j++, k++;
} else {
M3->data[k] = M2.data[j];
j++, k++;
}
}
while(i <= M1.nums) {
M3->data[k] = M1.data[i];
i++, k++;
}
while(j <= M2.nums) {
M3->data[k] = M2.data[j];
j++, k++;
}
M3->rows = M1.rows;
M3->cols = M1.cols;
M3->nums = k - 1;
}
int main() {
TSMatrix M1, M2, M3;
printf("请输入第一个矩阵:\n");
CreateTSMatrix(&M1);
printf("请输入第二个矩阵:\n");
CreateTSMatrix(&M2);
AddTSMatrix(M1, M2, &M3);
printf("两个矩阵相加的结果为:\n");
PrintTSMatrix(M3);
return 0;
}
```
程序的基本思路是先定义三元组类型 `Triple` 和稀疏矩阵类型 `TSMatrix`,然后定义三个函数:`CreateTSMatrix` 用于创建稀疏矩阵,`PrintTSMatrix` 用于输出稀疏矩阵,`AddTSMatrix` 用于实现两个稀疏矩阵的加法运算。
在 `CreateTSMatrix` 函数中,程序先读入矩阵的行数、列数和非零元素个数,然后读入矩阵的三元组表,并存储到 `M->data` 数组中。
在 `PrintTSMatrix` 函数中,程序遍历整个矩阵,对于每个位置,如果该位置是非零元素,则输出该元素的值,否则输出 0。
在 `AddTSMatrix` 函数中,程序先判断两个矩阵的行数和列数是否相等,如果不相等,则无法相加,直接返回。然后程序使用类似归并排序的方式,将两个矩阵的三元组表归并成一个三元组表,最后存储到 `M3->data` 数组中。在归并的过程中,如果两个三元组的行数和列数相等,则将它们的值相加,否则直接将它们存储到 `M3->data` 数组中。最后程序将 `M3` 的行数、列数和非零元素个数赋值为归并后的结果。
最后在主函数中,程序先分别创建两个稀疏矩阵 `M1` 和 `M2`,然后调用 `AddTSMatrix` 函数对它们进行相加,最后输出相加的结果。
阅读全文