三元组表示矩阵,以及稀疏矩阵的转置

 


#include<iostream>
#include<stdio.h>
using namespace std;

#define MAXSIZE 100
typedef struct{
 int row,col;//非0元素的位置坐标。
 int key;//非0元素的键值。
}Triple;


typedef struct{
 Triple data[MAXSIZE];//非0元三元组表。
 int mu,nu,totalNu;//mu矩阵行数,nu矩阵列数,totalNu矩阵非0元个数
}TSMatrix;//非0元三元组结构

 

//打印矩阵,感觉这个打印方法写的不是太好,要是大的矩阵就太浪费内存了,希望提出意见,非常想改进这个打印方法。
void printMatrix(TSMatrix matrix)
{
 int temp[100][100];
 for(int i=0;i!=100;i++)
 {
  for(int j=0;j!=100;j++)
  {
   temp[i][j]=0;
  }
 }
 for(int i=0;i!=matrix.totalNu;i++)
 {
  temp[matrix.data[i].row][matrix.data[i].col]=matrix.data[i].key;
 }
 for(int i=0;i!=matrix.mu;i++)
 {
  for(int j=0;j!=matrix.nu;j++)
  {
   printf("%6d",temp[i][j]);
   if(j==(matrix.nu-1))
    cout<<endl;
  }
 }
}


//此转置方法仅适用于与totalNu<<mu*nu的情况。
//转置矩阵方法,采用的是先找到原矩阵中非0元素,然后对非0元素进行操作,所要的对象数组的小标进行相应修改。
void reverseMatrix(TSMatrix a,TSMatrix &b)
{
 //转置后的矩阵行数是原先的列数。
 b.mu=a.nu;
 //转置后的矩阵列数是原先的行数。
 b.nu=a.mu;
 //非0元素总数不变
 b.totalNu=a.totalNu;
 //用来控制转置后的非0元素下表data[q]
 int q=0;
 //循环原矩阵的所有列
 for(int col1=0;col1<a.nu;col1++)
  //循环非0元素
  for(int p=0;p<a.totalNu;p++)
   //将每列的非0元素进行相应操作。
   if(a.data[p].col==col1)
   {
    b.data[q].row=a.data[p].col;
    b.data[q].col=a.data[p].row;
    b.data[q].key=a.data[p].key;
    ++q;
   }
}


int main()
{
 TSMatrix matrix;
 TSMatrix matrix1;
 cout<<"input the row number of matrix:(betwwen 0 and 100)";
 cin>>matrix.mu;
 cout<<"input the colum number of matrix:(betwwen 0 and 100)";
 cin>>matrix.nu;
 cout<<"input total number whose key not equal to zero:(betwwen 0 and 100)";
 cin>>matrix.totalNu;
 
 for(size_t index=0;index!=matrix.totalNu;index++)
 {
  cin>>matrix.data[index].row>>matrix.data[index].col>>matrix.data[index].key;

 }
 printMatrix(matrix);
 reverseMatrix(matrix,matrix1);
 
 
 cout<<"转置后的矩阵为:"<<endl;
 printMatrix(matrix1);

 system("PAUSE");
 return 0;

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值