C语言已知稀疏矩阵用三元组表示编写C=A+B的算法。
时间: 2024-04-29 14:23:31 浏览: 117
三元组表示法是一种用三个数组来表示稀疏矩阵的方法,其中第一个数组存储非零元素的值,第二个数组存储非零元素的行号,第三个数组存储非零元素的列号。对于两个稀疏矩阵A和B,要求它们的列数相等,即A的列数等于B的行数,才能进行矩阵乘法C=A B。
具体的算法步骤如下:
1. 定义三元组表示法的结构体,包括非零元素的值、行号和列号三个数组。
2. 读入稀疏矩阵A和B,并将它们转换成三元组表示法。
3. 定义矩阵C的三元组表示法结构体,包括非零元素的值、行号和列号三个数组,以及矩阵C的行数和列数。
4. 对于每个非零元素A(i,k),在B(k,j)中寻找非零元素,将它们相乘并累加到C(i,j)中。
5. 将矩阵C的三元组表示法转换成普通的矩阵形式,输出结果。
下面是具体的C语言实现代码:
```
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100
// 三元组表示法结构体
typedef struct {
int value[MAX_SIZE];
int row[MAX_SIZE];
int col[MAX_SIZE];
int size; // 非零元素个数
} Triplet;
// 矩阵C的三元组表示法结构体
typedef struct {
int value[MAX_SIZE];
int row[MAX_SIZE];
int col[MAX_SIZE];
int rows;
int cols;
int size; // 非零元素个数
} Matrix;
// 读入稀疏矩阵
void readMatrix(Triplet *T) {
int m, n, k;
printf("请输入稀疏矩阵的行数、列数和非零元素个数:");
scanf("%d%d%d", &m, &n, &k);
T->size = k;
printf("请依次输入每个非零元素的值、行号和列号:\n");
for (int i = 0; i < k; i++) {
scanf("%d%d%d", &T->value[i], &T->row[i], &T->col[i]);
}
}
// 矩阵乘法
void matrixMultiply(Triplet A, Triplet B, Matrix *C) {
if (A.col[0] != B.row[0]) {
printf("矩阵A的列数必须等于矩阵B的行数\n");
return;
}
int m = A.row[A.size - 1];
int n = B.col[B.size - 1];
int p = A.col[A.size - 1];
C->rows = m;
C->cols = n;
int c[MAX_SIZE][MAX_SIZE] = {0};
for (int i = 0; i < A.size; i++) {
for (int j = 0; j < B.size; j++) {
if (A.col[i] == B.row[j]) {
c[A.row[i] - 1][B.col[j] - 1] += A.value[i] * B.value[j];
}
}
}
C->size = 0;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (c[i][j] != 0) {
C->value[C->size] = c[i][j];
C->row[C->size] = i + 1;
C->col[C->size] = j + 1;
C->size++;
}
}
}
}
// 输出矩阵
void printMatrix(Matrix C) {
printf("矩阵C的元素如下:\n");
for (int i = 0; i < C.rows; i++) {
for (int j = 0; j < C.cols; j++) {
int flag = 0;
for (int k = 0; k < C.size; k++) {
if (C.row[k] == i + 1 && C.col[k] == j + 1) {
printf("%d ", C.value[k]);
flag = 1;
break;
}
}
if (flag == 0) {
printf("0 ");
}
}
printf("\n");
}
}
int main() {
Triplet A, B;
readMatrix(&A);
readMatrix(&B);
Matrix C;
matrixMultiply(A, B, &C);
printMatrix(C);
return 0;
}
```
阅读全文