c代码
#include <stdio.h>
#define MaxSize 128
#define M 6
#define N 7
#define ERROR 0
#define OK 1
typedef int Status;
typedef struct
{
int i; //行号
int j; //列号
int v; //元素值
} TupNode; //三元组定义
typedef struct
{
int rows; //行数
int cols; //列数
int nums; //非零元素个数
TupNode data[MaxSize + 1]; // 第0个位置不用
} TSMatrix;
// 输出矩阵
Status ShowA(int A[M][N]){
for(int i = 0; i < M; i++){
for(int j = 0; j < N; j++){
printf("%d\t", A[i][j]);
}
printf("\n\n");
}
return OK;
}
// 矩阵转三元组
Status CreatMat(TSMatrix &t, int A[M][N]){
// 行数与列数
t.rows = M;
t.cols = N;
// 计算非0元素个数, 也可当作三元组的下标
t.nums = 0;
// 遍历矩阵
for(int i = 0; i < M; i++){
for(int j = 0; j < N; j++){
// 存储非0元素
if(A[i][j] != 0){
// 提前+1,三元表第0个位置不使用
t.nums++;
// 存储矩阵值
t.data[t.nums].i = i + 1;
t.data[t.nums].j = j + 1;
t.data[t.nums].v = A[i][j];
}
}
}
return OK;
}
// 输出三元组
Status ShowMat(TSMatrix t){
if(t.nums <= 0) return ERROR;
printf("(\n");
for(int i = 1; i <= t.nums; i++)
printf("(%d, %d, %d)\n", t.data[i].i, t.data[i].j, t.data[i].v);
printf(")\n");
return OK;
}
// 矩阵转置
int TransposeMat(TSMatrix Mat, TSMatrix &TMat){
// 控制新三元组的下标位置
int q = 0;
// 行列调换
TMat.rows = Mat.cols;
TMat.cols = Mat.rows;
TMat.nums = Mat.nums;
// 如果三元组没有值就退出
if(Mat.nums <= 0) return ERROR;
// 转置
for(int i = 0; i < TMat.rows; i++){
for(int p = 1; p <= Mat.nums; p++){
if(Mat.data[p].j == i + 1){
q++;
TMat.data[q].i=Mat.data[p].j;
TMat.data[q].j=Mat.data[p].i;
TMat.data[q].v=Mat.data[p].v;
}
}
}
return OK;
}
int task9(){
TSMatrix Mat, TMat;
// 初始矩阵
int A[M][N] = {
{0, 12, 9, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0},
{-3, 0, 0, 0, 0, 14, 0},
{0, 0, 24, 0, 0, 0, 0},
{0, 18, 0, 0, 0, 0, 0},
{15, 0, 0, -7, 0, 0, 0}
};
printf("-------------------初始矩阵-------------------\n");
ShowA(A);
// 压缩矩阵(行优先)
CreatMat(Mat, A);
printf("------------------- 压缩后 -------------------\n");
ShowMat(Mat);
printf("-------------------转置矩阵-------------------\n");
int B[N][M];
for(int i = 0; i < N; i++){
for(int j = 0; j < M; j++){
B[i][j] = 0;
}
}
for(int i = 1; i <= Mat.nums; i++){
B[Mat.data[i].j - 1][Mat.data[i].i - 1] = Mat.data[i].v;
}
for(int i = 0; i < N; i++){
for(int j = 0; j < M; j++){
printf("%d\t", B[i][j]);
}
printf("\n\n");
}
printf("------------------- 转置后 -------------------\n");
// 矩阵转置(行优先)
TransposeMat(Mat, TMat);
ShowMat(TMat);
}