稀疏矩阵转置以及输出
代码实现:
1.稀疏矩阵的输入
2.稀疏矩阵转三元组
3.转置
4.三元组转稀疏矩阵
#include<iostream.h>
#include<stdio.h>
#define MAXSIZE 10000
typedef int ElemType;
typedef int Status;
#define M1 4
#define N1 4
typedef struct{ //三元组
int row; //行
int line; //列
ElemType elem; //元素大小
}triple;
typedef struct{ //矩阵
triple data[MAXSIZE];
int rownum; //行数
int linenum; //列数
int elemnum; //元素总数
}Trix;
void createTrix(Trix &M,ElemType a[M1][N1]){ //创建稀疏矩阵
M.linenum=N1;
M.rownum=M1;
M.elemnum=0;
for(int i=0;i<M1;i++)
for(int j=0;j<N1;j++)
if(a[i][j]!=0)
{
M.data[M.elemnum].row=i;
M.data[M.elemnum].line=j;
M.data[M.elemnum].elem=a[i][j];
M.elemnum++;
}
cout<<"已将稀疏矩阵转化为三元组"<<endl;
}
void coutTrix(Trix N){ //输出稀疏矩阵
int k=0;
if(N.elemnum!=0){
for(int i=0;i<N.rownum;i++){ //行数
for(int j=0;j<N.linenum;j++){ //列数
if(N.data[k].line==j&&N.data[k].row==i){ //比较,如果行列相等就输出,没有就输出零
cout<<N.data[k].elem<<" ";
k++;
}
else cout<<0<<" ";
}
cout<<endl;
}
}
cout<<"稀疏矩阵转化完毕!"<<endl;
}
void coutTriple(Trix M){ //输出三元组
int num=0;
cout<<"三元组输出如下"<<endl;
cout<<"num row line value"<<endl;
cout<<"---------------------"<<endl;
for(int i=0;i<M.elemnum;i++){
cout<<num<<" "<<M.data[i].row<<" "<<M.data[i].line<<" "<<M.data[i].elem<<endl;
num++;
}
cout<<"输出完毕"<<endl;
}
void transTriple(Trix &M,Trix &N){//转置三元组
int k;
N.rownum=M.linenum; //行列互换
N.linenum=M.rownum;
N.elemnum=M.elemnum; //元素个数一样
if(M.elemnum!=0)
{
k=0;
for(int i=0;i<M.linenum;i++)//N的行数
for(int j=0;j<M.elemnum;j++)
if(M.data[j].line==i)
{
N.data[k].line=M.data[j].row;
N.data[k].row=M.data[j].line;
N.data[k].elem=M.data[j].elem;
k++;
}
}
cout<<"三元组转置成功"<<endl;
}
void main(){
Trix M,N;
int i=0,j=0;
int row,line;
cout<<"请输入稀疏矩阵的行数和列数"<<endl;
cin>>row>>line;
int a[M1][N1]={0};
cout<<"请输入稀疏矩阵的元素"<<endl;
for(i=0;i<row;i++)
for(j=0;j<line;j++)
cin>>a[i][j];
createTrix(M,a);
coutTriple(M); //三元组输出方式
transTriple(M,N);
coutTriple(N); //三元组输出方式
coutTrix(N); //稀疏矩阵输出方式
}