编写c++程序实现利用三元组存储实现矩阵的转置算法
时间: 2024-05-29 07:12:47 浏览: 136
C和C++实现稀疏矩阵创建、快速转置(数据结构)
5星 · 资源好评率100%
#include <stdio.h>
#define MAX_SIZE 100
typedef struct {
int i, j; // 行、列下标
int value; // 元素值
} Triple;
typedef struct {
Triple data[MAX_SIZE + 1]; // 存放三元组的数组
int m, n, num; // 行数、列数、非零元素个数
} Matrix;
// 创建稀疏矩阵
void createMatrix(Matrix *mat) {
printf("请输入矩阵的行数和列数:");
scanf("%d %d", &mat->m, &mat->n);
printf("请输入矩阵的非零元素个数:");
scanf("%d", &mat->num);
printf("请输入矩阵的三元组:\n");
for (int i = 1; i <= mat->num; i++) {
scanf("%d %d %d", &mat->data[i].i, &mat->data[i].j, &mat->data[i].value);
}
}
// 打印稀疏矩阵
void printMatrix(Matrix mat) {
printf("该矩阵的三元组表示如下:\n");
for (int i = 1; i <= mat.num; i++) {
printf("%d %d %d\n", mat.data[i].i, mat.data[i].j, mat.data[i].value);
}
}
// 矩阵转置
void transpose(Matrix mat, Matrix *tMat) {
tMat->m = mat.n; // 转置后行数变为原来的列数
tMat->n = mat.m; // 转置后列数变为原来的行数
tMat->num = mat.num; // 非零元素个数不变
int q = 1; // tMat->data[] 的下标
for (int col = 1; col <= mat.n; col++) { // 遍历 mat 的每一列
for (int p = 1; p <= mat.num; p++) { // 遍历 mat 的每一行
if (mat.data[p].j == col) { // 找到 mat 中这一列的非零元素
tMat->data[q].i = mat.data[p].j; // 行下标变为原来的列下标
tMat->data[q].j = mat.data[p].i; // 列下标变为原来的行下标
tMat->data[q].value = mat.data[p].value; // 元素值不变
q++; // tMat->data[] 的下标加 1
}
}
}
}
int main() {
Matrix mat, tMat;
createMatrix(&mat);
printMatrix(mat);
transpose(mat, &tMat);
printf("转置后的矩阵三元组表示如下:\n");
for (int i = 1; i <= tMat.num; i++) {
printf("%d %d %d\n", tMat.data[i].i, tMat.data[i].j, tMat.data[i].value);
}
return 0;
}
阅读全文