PTA:稀疏矩阵快速转置

稀疏矩阵快速转置 

利用三元组顺序表存放的矩阵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版权协议,转载请附上原文出处链接和本声明。