以三元组形式存储的稀疏矩阵,实现转置。
要求:以矩阵形式输出最终结果
#include <stdio.h>
#include <stdlib.h>
#define m 1000
typedef struct
{
int i, j;//矩阵行与列的位置
int a;//非零元的值
}three_team;//定义三元组
typedef struct
{
three_team data[m];//存储所有非零元的三元组
int e, f, t;//矩阵行数与列数与非零元的个数
}juzhen;//定义三元组矩阵
juzhen create()//所要转置的矩阵
{
juzhen M;
int n;
printf("输入矩阵的行数,列数,非零元个数:\n");
scanf_s("%d%d%d", &M.e, &M.f, &M.t);
printf("输入非零元的行数,列数和值:\n");
for(n=0;n<M.t;n++)
scanf_s("%d%d%d", &M.data[n].i, &M.data[n].j, &M.data[n].a);
return M;//返回到主函数矩阵M
}
juzhen change(juzhen M, juzhen T)//转置矩阵T
{
int q, w, p;
T.e = M.f; T.f = M.e; T.t = M.t;//行数与列数互换
if (T.t )
{
q = 0;
for(w=1;w<=M.f;w++)//以列数为循环条件
for(p=0;p<M.t;p++)
if (M.data[p].j == w)//当与列的位置相等时,该列的列行互换
{
T.data[q].i = M.data[p].j;
T.data[q].j = M.data[p].i;
T.data[q].a = M.data[p].a;
q++;//q与p始终保持相等
}
}
return T; //返回到主函数矩阵T
}
print(juzhen M)//将三元组以矩阵的形式输出
{
int x, y, n, k=0;
for (x = 1; x <=M.e; x++)//控制行
{
for (y = 1; y <= M.f; y++)//控制列
{
if ((M.data[k].i == x) && (M.data[k].j == y))//行与列均相等时进入循环
{
printf("%3d", M.data[k].a);
++k;//将这一列的非零元打印出来
}
else
printf("%3d", 0);//如果没有非零元则打印0
}
printf("\n");
}
}
int main()
{
juzhen M, T = {0};
M = create();
printf("原矩阵为:\n");
print(M);
T = change(M, T);
printf("转置后的矩阵为:\n");
print(T);
printf("转置后的三元组:\n");
for (int n = 0; n <T.t; n++)
printf("%3d%3d%3d\n", T.data[n].i, T.data[n].j, T.data[n].a);
}