ADT稀疏矩阵的表示及其快速转置
#include<iostream>
#include<fstream>
using namespace std;
#define MAXX 100
ifstream file("data.txt",ios::in);/
typedef struct
{
int row,col,value;
}term;
class Sparse_Matrix
{
private:
int n_row,n_col,num;
term *a;
public:
Sparse_Matrix(int row,int col,int num);
Sparse_Matrix(){;};
void show();
void transpose(Sparse_Matrix & B);
void fast_transpose(Sparse_Matrix & B);
};
Sparse_Matrix::Sparse_Matrix(int row,int col,int num)
{
this->n_row=row;
this->n_col=col;
this->num=num;
a=new term[num+1];
for(int i=1;i<=num;i++)
{
//cin>>a[i].row>>a[i].col>>a[i].value;
file>>a[i].row>>a[i].col>>a[i].value;
}
}
void Sparse_Matrix::show()
{
cout<<n_row<<"行"<<n_col<<"列"<< num<<"个值"<<endl;
for(int i=1;i<=num;i++)
{
cout<<a[i].row<<"\t"<<a[i].col<<"\t"<<a[i].value<<endl;
}
}
void Sparse_Matrix::transpose(Sparse_Matrix &B)
{
B.n_col=n_row;
B.n_row=n_col;
B.num=num;
term *b=new term[num+1];
int c=1;
for(int i=0;i<n_col;i++)
{
for(int j=1;j<=num;j++)
{
if(a[j].col==i)
{ b[c].row=a[j].col; b[c].col =a[j].row; b[c].value=a[j].value; c++;}
}
}
B.a=b;
}
void Sparse_Matrix::fast_transpose(Sparse_Matrix & B)
{
B.n_col=n_row;
B.n_row=n_col;
B.num=num;
term *b=new term[num+1];
int start_pos[MAXX],row_terms[MAXX];
int i,j;
for(i=0;i<n_col;i++) row_terms[i]=0;
for(i=1;i<=num;i++) row_terms[a[i].col]++;
start_pos[0]=1;
for(i=1;i<n_col;i++) start_pos[i]=start_pos[i-1]+row_terms[i-1];
for(j=1;j<=num;j++)
{
int pos=start_pos[a[j].col]++;
b[pos].row=a[j].col;
b[pos].col=a[j].row;
b[pos].value=a[j].value;
}
B.a=b;
}
int main()
{
if(!file) {cout<<"failed open"; exit(1); }
int r,c,n;
file>>r>>c>>n;
Sparse_Matrix A(r,c,n),B,C;
cout<<"A:"<<endl; A.show();
A.transpose(B);
cout<<"B:"<<endl; B.show();
A.fast_transpose(C);
cout<<"C:"<<endl; C.show();
return 0;
}