#include <stdio.h>
#define MaxSize 20
typedef struct {
int row, col;//行,列
int e;//元素的值
} Triple;
typedef struct {
Triple data[MaxSize + 1];
int m;//行
int n;//列
int len;//元素个数
} TSMatrix;
void TransposeSMatrix(TSMatrix M, TSMatrix *N);//简单转置
void TransposeSMatrixquick(TSMatrix M, TSMatrix *N);//快速转置
void Entercreate(TSMatrix *M);//矩阵创建
void visit(TSMatrix N);//矩阵输出
int main() {
TSMatrix A;
TSMatrix B;
TSMatrix C;
Entercreate(&A);
visit(A);
printf("\n\n-----简单转置-----\n\n");
TransposeSMatrix(A, &B);
visit(B);
printf("\n\n-----快速转置-----\n\n");
TransposeSMatrixquick(A, &C);
visit(C);
return 0;
}
//简单转置
void TransposeSMatrix(TSMatrix M, TSMatrix *N) {
N->m = M.n;
N->n = M.m;
N->len = M.len;
if (N->len > 0) {
int p = 1;
for (int i = 1; i <= M.n; i++)
for (int j = 1; j <= M.len; j++)
if (M.data[j].col == i) {
N->data[p].row = M.data[j].col;
N->data[p].col = M.data[j].row;
N->data[p].e = M.data[j].e;
++p;
}
}
}
//快速转置
void TransposeSMatrixquick(TSMatrix M, TSMatrix *N) {
int num[MaxSize], pos[MaxSize];
N->m = M.n;
N->n = M.m;
N->len = M.len;
if (N->len > 0) {
for (int i = 1; i <= M.n; i++)
num[i] = 0;
for (int i = 1; i <= M.len; i++) {
int j = M.data[i].col;
num[j]++;
}
pos[1] = 1;
for (int i = 2; i <= M.n; i++)
pos[i] = pos[i - 1] + num[i - 1];
for (int i = 1; i <= M.len; i++) {
int col = M.data[i].col;
int q = pos[col];
N->data[q].row = M.data[i].col;
N->data[q].col = M.data[i].row;
N->data[q].e = M.data[i].e;
pos[col]++;
}
}
}
void Entercreate(TSMatrix *M) {
int a;
int n = 1;
int col, row;
M->len = 1;
printf("输入创建几行几列矩阵:\n");
scanf("%d%d", &M->m, &M->n);
printf("请输入矩阵元素:\n");
for (row = 1; row <= M->m; row++) {
for (col = 1; col <= M->n; col++) {
scanf("%d", &a);
if (a != 0) {
M->data[n].e = a;
M->data[n].row = row;
M->data[n].col = col;
M->len++;
n++;
}
}
}
printf("完成输入!\n");
}
void visit(TSMatrix N) {
int i, j, k = 1;
for (i = 1; i <= N.m; i++) {
for (j = 1; j <= N.n; j++)//第i行第j列
{
if (i == N.data[k].row && j == N.data[k].col) {
printf("%3d", N.data[k].e);
k++;
} else printf(" 0");
}
printf("\n");
}
}
/*void visit(TSMatrix T)
{
int t=1;
int sum=0;
for(int i=1;i<=T.m;i++)
{
for(int j=1;j<=T.n;j++)
{
if(T.data[t].row==i && T.data[t].col==j)
{
printf("%d ",T.data[t].e);
t++;
}
else
{
printf("0 ");
}
sum++;
if(sum%T.n==0)
printf("\n");
}
}
} */
6. 三元组压缩存储结构的稀疏矩阵的转置运算
于 2022-10-26 12:53:32 首次发布