三元组逆置

#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();
  
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值