#include<iostream.h>
#include<time.h>
#include<stdlib.h>
#include<stdio.h>
class Mat
{
public:
int *data;
int row,col;
Mat(int m,int n,int k)
{
int i;srand(time(0));
row=m;col=n;data=new int[m*n];
for(i=0;i<m*n;i++) data[i]=0;
for(i=0;i<k;i++)
SetMat(rand() % m,rand() %n,rand()%100);
}
void SetMat(int i,int j,int x)
{
data[i*col+j]=x;
}
int GetMat(int i,int j)
{
return data[i*col+j];
}
void PrintMat()
{
int i,j;
for(i=0;i<row;i++)
{
for(j=0;j<col;j++)
printf("%5d",GetMat(i,j));
printf("/n");
}
}
};
struct Node
{
int row,col,item;
};
class Mat3
{
public:
int mu,nu,tu;
Node *data;
Mat3(){data=new Node[50];}
Mat3(Mat X)
{
int i,j,k=0;
mu=X.row;nu=X.col;data=new Node[mu*nu/2];
for(i=0;i<X.row;i++)
for(j=0;j<X.col;j++)
if(X.GetMat(i,j)!=0)
{
data[k].row=i;data[k].col=j;data[k].item=X.GetMat(i,j);
k++;
}
tu=k;
}
int Get(int i,int j)
{
int k;
for(k=0;k<tu;k++)
if(data[k].row==i && data[k].col==j)
return data[k].item;
return 0;
}
void PrintMat3()
{
int i,j;
for(i=0;i<mu;i++)
{
for(j=0;j<nu;j++)
printf("%5d",Get(i,j));
printf("/n");}
}
Mat3 convert()
{
int pb[15],num[15],i,j,k;
Mat3 B;
B.nu=mu;B.mu=nu; B.tu=tu;
pb[0]=0;
for(i=0;i<nu;i++) num[i]=0;
for(i=0;i<tu;i++) num[data[i].col]++;
for(i=1;i<nu;i++) pb[i]=pb[i-1]+num[i-1];
for(i=0;i<tu;i++)
{
j=data[i].col;k=pb[j];
B.data[k].row=data[i].col;
B.data[k].col=data[i].row;
B.data[k].item=data[i].item; pb[j]++;
}
return B;
}
};
void Convert(Mat3 A,Mat3 &B)//求三元组表示的转置三元组表
{
int pb[15],num[15],i,j,k;
B.data=new Node[A.tu];
B.mu=A.nu;B.nu=A.mu; B.tu=A.tu;
pb[0]=0;
for(i=0;i<A.nu;i++) num[i]=0;
for(i=0;i<A.tu;i++) num[A.data[i].col]++;
for(i=1;i<A.nu;i++) pb[i]=pb[i-1]+num[i-1];
for(i=0;i<A.tu;i++)
{
j=A.data[i].col;k=pb[j];
B.data[k].row=A.data[i].col;
B.data[k].col=A.data[i].row;
B.data[k].item=A.data[i].item; pb[j]++;
}
}
void main()
{
Mat S(4,5,6);
cout<<"原始矩阵输出:"<<endl;
S.PrintMat();
Mat3 A(S);
cout<<"三元组矩阵输出:"<<endl;
A.PrintMat3();
Mat3 B;
Convert(A,B);
cout<<"转置矩阵输出:"<<endl;
B.PrintMat3();
}