样例输入
3 4 3 0 1 5 1 2 2 2 1 6
样例输出
4 3 3 1 0 5 1 2 6 2 1 2
外循环扫描A.cols,扫描三元组A的列,一列一列的扫,从0列开始,把第0列的从0-A.nums扫描到的依次放入B,原始三元组小的在上。(其实,把它转置就是非零元按列存放)
#include <iostream>
using namespace std;
#define MAXSIZE 100
typedef int ElemType;
//建立三元组结构体
typedef struct
{
int row;
int col;
ElemType value;
}Triple;
//稀疏矩阵的三元组表示
typedef struct{
int rows;
int cols;
int nums;
Triple *data;//类似于int *p;
}SpMa;
//初始化
void InitSpMa(SpMa &Sm,int rows,int cols);
void CreatSpMa(SpMa &Sm);
void PrintSpMa(SpMa Sm);
void Transpose(SpMa A,SpMa &B);
int main()
{
SpMa Sm,B;
int rows,cols;
cin>>rows>>cols;
InitSpMa(Sm,rows,cols);
InitSpMa(B,rows,cols);
CreatSpMa(Sm);
Transpose(Sm,B);
PrintSpMa(B);
}
void InitSpMa(SpMa &Sm,int rows,int cols)
{
Sm.cols=cols;
Sm.rows=rows;
Sm.nums=0;
Sm.data=new Triple[MAXSIZE];
}
void CreatSpMa(SpMa &Sm)
{
int nums;
cin>>nums;
Sm.nums=nums;
for(int i=0;i<nums;i++)
{
cin>>Sm.data[i].row>>Sm.data[i].col>>Sm.data[i].value;
}
}
void Transpose(SpMa A,SpMa &B)
{
int k=0;
B.cols=A.rows;
B.rows=A.cols;
B.nums=A.nums;
for(int i=0;i<A.cols;i++)
{
for(int j=0;j<A.nums;j++)
{
if(A.data[j].col==i)
{
B.data[k].col=A.data[j].row;
B.data[k].row=A.data[j].col;
B.data[k].value=A.data[j].value;
k++;
}
}
}
}
void PrintSpMa(SpMa A)
{
int i;
//cout<<"行,列,非零元素个数为:";
cout<<A.rows<<" "<<A.cols<<" "<<A.nums<<endl;
//cout<<"稀疏矩阵的三元组表示为:"<<endl;
for(i=0;i<A.nums;i++)
cout<<A.data[i].row<<" "<<A.data[i].col<<" "<<A.data[i].value<<endl;
}