问题
用三元组存储矩阵并实现矩阵转置
要求:输出转置前后矩阵的三元组顺序表。
转置思路
矩阵 s 有 j 列有 k 个非零元素,s 的第 j 列构成了转置矩阵的第 j 行
那么矩阵 s 中的行 r ,有着 r1 < r2 < ……< rk
所以要找出 t 中第一个元素 j,r1 所在位置 pos[j]
转置矩阵第一行第一个位置为 pos[1] = 1;pos[ j + 1 ] = pos[ j ] + num[ j ];
void transpose(tsmatrix t, tsmatrix& s) {//s为t的转置矩阵
int i, j, k = 0;
int num[10] = {0}, pos[10];
s.rows = t.rows; s.cols = t.cols; s.nums = t.nums;
if ( s.nums ) {
//统计已知矩阵t各列元素非零个数
for ( j = 0; j < t.nums; j++) {
num[t.data[j].c]++;
}
//计算已知矩阵t各行第一个元素位置
for (pos[1]=0, i = 0; i < t.cols ; i++) {
pos[i+1] = pos[i] + num[i];
}
//转置矩阵
for (j = 0; j < s.nums; j++) {
s.data[pos[t.data[j].c ]].c = t.data[j].r;
s.data[pos[t.data[j].c ]].r = t.data[j].c;
s.data[pos[t.data[j].c ]].e = t.data[j].e;
pos[t.data[j].c]++;//让下一个起始位置+1
}
}
}
附上完整代码和结果
#include <stdio.h>
typedef struct {
int r, c, e;
}triple;
typedef struct {
int rows, cols, nums;
triple data[100];
}tsmatrix;
void creat(tsmatrix& t, int a[3][5]) {
int i, j;
t.rows = 3; t.cols = 5; t.nums = 0;
for ( i = 0; i < 3; i++) {
for (j = 0; j < 5; j++) {
if (a[i][j] != 0) {
t.data[t.nums].r = i;
t.data[t.nums].c = j;
t.data[t.nums].e = a[i][j];
t.nums++;
}
}
}
}
void show(tsmatrix t) {
int i;
if (t.nums <= 0) {
printf("is null\n");
return;
}
for ( i = 0; i < t.nums; i++) {
printf("%3d%3d%3d\n", t.data[i].r, t.data[i].c, t.data[i].e);
}
}
void transpose(tsmatrix t, tsmatrix& s) {
int i, j, k = 0;
int num[10] = {0}, pos[10];
s.rows = t.rows; s.cols = t.cols; s.nums = t.nums;
if ( s.nums ) {
for ( j = 0; j < t.nums; j++) {
num[t.data[j].c]++;
}
for (pos[1]=0, i = 0; i < t.cols ; i++) {
pos[i+1] = pos[i] + num[i];
}
for (j = 0; j < s.nums; j++) {
s.data[pos[t.data[j].c ]].c = t.data[j].r;
s.data[pos[t.data[j].c ]].r = t.data[j].c;
s.data[pos[t.data[j].c ]].e = t.data[j].e;
pos[t.data[j].c]++;
}
}
}
int main() {
int a1[3][5] = { {1,0,0,0,8},{0,0,0,0,4},{3,0,0,0,0} };
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 5; j++) {
printf("%d", a1[i][j]);
if (j == 4) {
printf("\n");
}
}
}
tsmatrix a, b;
creat(a, a1);
printf("before\n");
show(a);
printf("after:\n");
transpose(a, b);
show(b);
return 0;
}