用C语言完成当具有相同行数和列数的稀疏矩阵 A 和 B 均以三元组表作为存储结构时,试写出矩阵相加算法,其结果存放在三元组表 C 中并美观输出结果。写出完整程序,并备注详细注释
时间: 2024-11-22 18:40:03 浏览: 14
数据结构C语言版-稀疏矩阵的三元组顺序表存储表示和实现最新文档.doc
在C语言中,我们可以使用动态内存分配来创建和操作稀疏矩阵。这里我们假设三元组表是一个结构体,包含行索引、列索引和对应的元素值。下面是一个简单的矩阵相加算法示例:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义稀疏矩阵的三元组结构体
typedef struct {
int row; // 行索引
int col; // 列索引
double val; // 元素值
} SparseTriple;
// 矩阵结构体,用于存储矩阵的行数、列数以及三元组表
typedef struct {
int rows;
int cols;
SparseTriple* data;
int capacity;
} SparseMatrix;
// 动态添加三元组到矩阵数据结构
void addsparse(SparseMatrix* mat, int row, int col, double val) {
if (mat->data == NULL || mat->capacity == mat->rows * mat->cols) { // 如果已满,扩大容量
mat->data = realloc(mat->data, sizeof(SparseTriple)*(mat->capacity *= 2));
}
mat->data[mat->capacity++] = (SparseTriple){row, col, val};
}
// 矩阵相加函数
void sparse_matrix_addition(SparseMatrix* a, SparseMatrix* b, SparseMatrix* c) {
for (int i = 0; i < a->rows && i < b->rows; ++i) {
for (int j = 0; j < a->cols && j < b->cols; ++j) {
// 如果两个矩阵都有该位置的元素,则相加
if (a->data[i*a->cols + j].val != 0 && b->data[i*b->cols + j].val != 0) {
c->data[c->capacity++] = (SparseTriple){i, j, a->data[i*a->cols + j].val + b->data[i*b->cols + j].val};
}
}
}
}
// 输出矩阵
void print_sparse_matrix(const SparseMatrix* mat) {
printf("Matrix:\n");
for (int i = 0; i < mat->rows; ++i) {
for (int j = 0; j < mat->cols; ++j) {
if (mat->data[i*mat->cols + j].val != 0) {
printf("(%d,%d) -> %.4f ", mat->data[i*mat->cols + j].row, mat->data[i*mat->cols + j].col, mat->data[i*mat->cols + j].val);
}
}
printf("\n");
}
}
int main() {
// 初始化矩阵A和B
SparseMatrix a = {5, 5, NULL, 0};
SparseMatrix b = {5, 5, NULL, 0};
// ... (这里填充你想要的三元组)
// 创建结果矩阵C
SparseMatrix c = {a.rows, a.cols, NULL, 0};
// 执行矩阵相加
sparse_matrix_addition(&a, &b, &c);
// 输出结果矩阵C
print_sparse_matrix(&c);
return 0;
}
```
阅读全文