.用C语言编程实现稀疏矩阵的转置,将源程序以实验5-1为文件名保存在自己的文件夹里面。 ①采用三元组顺序表创建一个稀疏矩阵; ②将矩阵的行列值相互交换; ③将每个三元组中的i和j相互调换; ④重排三元组之间的次序实现矩阵转置。 选作: 2、用C语言编程实现两稀疏矩阵的乘积 ①采用行逻辑链接的顺序表建立两个稀疏矩阵; ②求两稀疏矩阵的乘积
时间: 2024-02-24 17:53:17 浏览: 87
稀疏矩阵转置的c程序实现
以下是实现稀疏矩阵乘积的C语言代码,采用行逻辑链接的顺序表创建稀疏矩阵:
```
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100 // 稀疏矩阵的最大非零元素个数
typedef struct {
int i, j; // 三元组的行列下标
int value; // 三元组的值
int right; // 每行的右指针
} Triple;
typedef struct {
Triple data[MAXSIZE + 1]; // 非零元素三元组数组,data[0]存储矩阵的行数、列数和非零元素个数
int rows, cols, nums; // 稀疏矩阵的行数、列数和非零元素个数
int rpos[MAXSIZE + 1]; // 每行第一个非零元素在data中的位置
} RLSMatrix;
// 创建稀疏矩阵
void CreateMatrix(RLSMatrix *matrix) {
int i, j, k, last;
printf("请输入稀疏矩阵的行数、列数和非零元素个数:\n");
scanf("%d %d %d", &matrix->rows, &matrix->cols, &matrix->nums);
matrix->data[0].i = matrix->rows;
matrix->data[0].j = matrix->cols;
matrix->data[0].value = matrix->nums;
matrix->rpos[1] = 1;
printf("请输入每个非零元素的行列下标和值:\n");
for (k = 1; k <= matrix->nums; k++) {
scanf("%d %d %d", &matrix->data[k].i, &matrix->data[k].j, &matrix->data[k].value);
if (matrix->data[k].i > matrix->data[k - 1].i) {
for (last = matrix->data[k - 1].i + 1; last <= matrix->data[k].i; last++) {
matrix->rpos[last] = k;
}
}
}
while (last <= matrix->rows) {
matrix->rpos[last++] = matrix->nums + 1;
}
matrix->data[matrix->nums + 1].right = 0;
for (i = 1; i <= matrix->rows; i++) {
last = matrix->rpos[i];
for (j = 1; j <= matrix->cols; j++) {
if (last <= matrix->nums && matrix->data[last].j == j) {
matrix->data[last].right = last + 1;
last++;
} else {
matrix->data[last].right = 0;
}
}
}
}
// 打印稀疏矩阵
void PrintMatrix(RLSMatrix matrix) {
int i, j, k, last = 1;
printf("稀疏矩阵的三元组表表示如下:\n");
for (i = 1; i <= matrix.rows; i++) {
for (j = 1; j <= matrix.cols; j++) {
if (matrix.data[last].i == i && matrix.data[last].j == j) {
printf("%d ", matrix.data[last].value);
last++;
} else {
printf("0 ");
}
}
printf("\n");
}
}
// 稀疏矩阵乘积
void MatrixMultiply(RLSMatrix matrix1, RLSMatrix matrix2, RLSMatrix *result) {
int i, j, k, p, q, sum;
if (matrix1.cols != matrix2.rows) {
printf("两个稀疏矩阵无法相乘!\n");
return;
}
result->rows = matrix1.rows;
result->cols = matrix2.cols;
result->nums = 0;
for (i = 1; i <= matrix1.rows; i++) {
for (j = 1; j <= matrix2.cols; j++) {
sum = 0;
p = matrix1.rpos[i];
q = matrix2.rpos[j];
while (p <= matrix1.rpos[i + 1] && q <= matrix2.rpos[j + 1]) {
if (matrix1.data[p].j < matrix2.data[q].i) {
p++;
} else if (matrix1.data[p].j > matrix2.data[q].i) {
q++;
} else {
sum += matrix1.data[p].value * matrix2.data[q].value;
p++;
q++;
}
}
if (sum != 0) {
result->nums++;
result->data[result->nums].i = i;
result->data[result->nums].j = j;
result->data[result->nums].value = sum;
}
}
}
}
int main() {
RLSMatrix matrix1, matrix2, result;
CreateMatrix(&matrix1);
printf("第一个稀疏矩阵如下:\n");
PrintMatrix(matrix1);
CreateMatrix(&matrix2);
printf("第二个稀疏矩阵如下:\n");
PrintMatrix(matrix2);
MatrixMultiply(matrix1, matrix2, &result);
printf("两个稀疏矩阵乘积的稀疏矩阵如下:\n");
PrintMatrix(result);
return 0;
}
```
注意:在运行程序时需要按照提示输入两个稀疏矩阵的行数、列数和非零元素个数,以及每个非零元素的行列下标和值。
阅读全文