第1关:一般转置算法
本关任务:实现稀疏矩阵的转置操作(采用一般转置算法,即按列序转置)。
/*************************************************************
稀疏矩阵 实现文件
更新于2020年10月28日
**************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "SparseMatrix.h"
void input(SPMatrix &a)//输入采用三元组顺序表存储的矩阵
{
int p;
scanf("%d%d%d",&a.m,&a.n,&a.t); //输入矩阵总行数、总列数和非零元素的个数
for(p=0;p<a.t;p++)
scanf("%d%d%d",&a.data[p].i,&a.data[p].j,&a.data[p].v);
}
void output(SPMatrix a)//输出矩阵的三元组表
{
int p;
for(p=0;p<a.t;p++)
printf("(%d,%d,%d)\n",a.data[p].i,a.data[p].j,a.data[p].v);
}
void TransSMatrix(SPMatrix a, SPMatrix &b)//一般转置,即:按列序转置
{
// 请在这里补充代码,完成本关任务
/********** Begin *********/
b.m=a.n;
b.n=a.m;
b.t=a.t;
if (b.t) {
int q=0; //三元组表T的下标
int p; //三元组表M的下标
for (int col=0;col<=a.m; col++) { //从最小列顺序开始找
for (p=0; p<a.t; p++) { //从三元组表M顺序查找
if (a.data[p].j==col) { //三元组表M中当前列是最小列,则进行转置
b.data[q].i=a.data[p].j;
b.data[q].j=a.data[p].i;
b.data[q].v=a.data[p].v;
q++;
}
}
}
}
/********** End **********/
}
第2关:快速转置算法
本关任务:实现稀疏矩阵的转置操作(采用快速转置算法)。
/*************************************************************
稀疏矩阵 实现文件
更新于2020年10月28日
**************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "SparseMatrix.h"
void input(SPMatrix &a)//输入采用三元组顺序表存储的矩阵
{
int p;
scanf("%d%d%d",&a.m,&a.n,&a.t); //输入矩阵总行数、总列数和非零元素的个数
for(p=0;p<a.t;p++)
scanf("%d%d%d",&a.data[p].i,&a.data[p].j,&a.data[p].v);
}
void output(SPMatrix a)//输出矩阵的三元组表
{
int p;
for(p=0;p<a.t;p++)
printf("(%d,%d,%d)\n",a.data[p].i,a.data[p].j,a.data[p].v);
}
void FastTransSMatrix(SPMatrix a, SPMatrix &b)//快速转置
{
int p,q,i,k; int x[N],y[N];
b.m=a.n; b.n=a.m; b.t=a.t;
if(b.t==0)
{
printf("The matrix has no nonzero element!\n"); return;
}
for(i=0;i<a.n;i++) x[i]=0;
for(p=0;p<a.t;p++) //求A中每一列非零元个数存放到x[ ]中
{
/********** Begin *********/
int k=a.data[p].j;
x[k]++;
/********** End **********/
}
y[0]=0;
y[1]=y[0]+x[0];
for(i=2;i<a.n;i++)//求A中每一列的第一个非零元在B.data中的位置存放到y[ ]中
{
/********** Begin *********/
y[i]=y[i-1]+x[i-1];
/********** End **********/
}
for(p=0;p<a.t;p++) //扫描A.data,将A中每一三元组存放到B中恰当位置
{
/********** Begin *********/
int i=a.data[p].j;
int q=y[i];
b.data[q].i=a.data[p].j;
b.data[q].j=a.data[p].i;
b.data[q].v=a.data[p].v;
y[i]++;
/********** End **********/
}
}