稀疏矩阵快速转置
利用三元组顺序表存放的矩阵M,用快速转置的算法是实现转置得到矩阵T,并将T按照三元组形式输出,每行输出一个元素,注意:矩阵输出顺序按照行号升序输出。其中,行数<20、列数<20。
输入格式:
第一行输入M的行数mu,M的列数nu,M中非零元个数tu 从第二行开始输入tu行,每行输入一个元素的行号i、列号j和值data。
输出格式:
按照T的行号升序输出,每行输出一个元素的行号,列号,元素值,三个值以空格为分隔符
输入样例:
在这里给出一组输入。例如:
3 4 3
0 1 6
1 0 -1
2 2 4
输出样例:
在这里给出相应的输出。例如:
0 1 -1
1 0 6
2 2 4
代码如下:
#include<stdio.h>
typedef int ElemType;
#define MAXSIZE 12500
typedef struct {
int i, j; //该非零元的行下标和列下标
ElemType e; //数据域
}Triple;
typedef struct {
Triple data[MAXSIZE]; //非零元三元组表,data[0]使用了
int mu, nu, tu; //矩阵的行数,列数和非零元个数
}TSMatrix;
void GreateSMatrix(TSMatrix* M);
void TransposeSMatrix(TSMatrix* M, TSMatrix* T);
void PrintSMatrix(TSMatrix* T);
int main() {
TSMatrix *M=(TSMatrix*)malloc(sizeof(TSMatrix));
TSMatrix *T=(TSMatrix*)malloc(sizeof(TSMatrix));
GreateSMatrix(M);
TransposeSMatrix(M, T);
PrintSMatrix(T);
return 0;
}
void GreateSMatrix(TSMatrix* M) //创建稀疏矩阵M
{
scanf("%d %d %d", &M->mu,&M->nu,&M->tu);
if ((M->mu) > 0 &&(M->nu) > 0) {
if (M->tu < MAXSIZE)
{
for (int i = 0; i < M->tu; i++) {
scanf("%d %d %d", &M->data[i].i,&M->data[i].j,&M->data[i].e);
}
}
}
}
void TransposeSMatrix(TSMatrix* M, TSMatrix* T)//求稀疏矩阵M的转置矩阵T
{
T->mu = M->nu, T->nu = M->mu, T->tu = M->tu;
if (T->tu) {
int q=0 , p,col;
for(col=0;col<M->nu;col++)
for(p=0;p<M->tu;p++)
if (M->data[p].j == col) {
T->data[q].i = M->data[p].j;
T->data[q].j = M->data[p].i;
T->data[q].e = M->data[p].e;
++q;
}
}
}
void PrintSMatrix(TSMatrix* T) //输出矩阵
{
for (int i = 0; i < T->tu; i++) {
printf("%d %d %d", T->data[i].i, T->data[i].j, T->data[i].e);
printf("\n");
}
}
版权声明:本文为weixin_51363781原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。