#include<iostream>
#define Maxsize 1000
using namespace std;
int number[1000];
int position[1000];
typedef struct {
int row, col;
int elem;
}Triple;//三元组
typedef struct{
Triple data[Maxsize + 1];//数组形式存储三元组
int m, n ,len;
}TSMatrix;
TSMatrix TransMatrix(TSMatrix A,TSMatrix B) {
A.m = B.n;
A.n = B.m;
A.len = B.len;
if (B.len) {
for (int j = 1; j <= B.n; j++) {// 每个列数的个数初始化
number[j] = 0;
}
for (int k = 1; k <= B.len; k++) {//计算每个列数对应的个数
number[B.data[k].col]++;
}
position[1] = 1;//为什么<b.n,因为你要算第几列存放在哪个位置,你的列数可能大于你的个数
for (int l = 2; l <= B.n; l++) {//通过每个列数的个数来计算每个列数开始在哪个位置
position[l] = position[l - 1] + number[l - 1];
}
for (int o = 1; o <= B.len; o++) {//算出不是0元素的列数,也就是遍历三元组表
int j = B.data[o].col;
A.data[position[j]].col = B.data[o].row; //从哪边开始存放
A.data[position[j]].row = B.data[o].col;
A.data[position[j]].elem = B.data[o].elem;
position[j]++;
}
return A;
}
}
int main() {
/*int a[5][5] = {
3,0,0,0,7,
0,0,1,0,0,
1,2,0,0,0,
0,0,0,0,0,
0,0,0,2,0
};*/
int m, n, e;
TSMatrix A, B;
B.len = 0;
cout << "请输入矩阵的行和列:";
int x, y;
cin >> x >> y;
B.m = x;
B.n = y;
cout << "请输入矩阵的三元组表,以(0 0 0)结束:" << endl;
for (int i = 1;; i++) {//输入矩阵
cin >> m >> n >> e;
if (m == 0 && n == 0 && e == 0) {
break;
}
B.data[i].row = m;
B.data[i].col = n;
B.data[i].elem = e;
B.len++;
}
cout << "原矩阵:" << endl;
for (int i = 1; i <= B.len; i++) {
cout << "(" << B.data[i].row << "," << B.data[i].col << "," << B.data[i].elem << ")"<<endl;
}
cout << endl << endl;
A = TransMatrix(A, B);
cout << "转置后的矩阵:" << endl;
for (int i = 1; i <= A.len; i++) {
cout << "(" << A.data[i].row << "," << A.data[i].col << "," << A.data[i].elem << ")" << endl;
}
}
数据结构矩阵的快速转置
最新推荐文章于 2024-05-03 16:54:29 发布