数据结构学习--稀疏矩阵的三元组表示

// 稀疏矩阵的三元组表示
#include <stdio.h>
#define M 6
#define N 7
#define MaxSize M*N
typedef  int  ElemType;
struct  TupNode
{
     int  i, j;
     ElemType data;
};
class  TSMatrix
{
private :
     int  rows, cols, nums;
     struct  TupNode data[MaxSize];
public :
     TSMatrix(ElemType A[M][N]);
     TSMatrix( const  TSMatrix &other);
     TSMatrix()
     {
         nums = 0;
     }
     bool  SetValue( int  i,  int  j, ElemType x);
     bool  GetValue( int  i,  int  j, ElemType &x)  const ;
     void  print()  const ;
     TSMatrix Trans()  const //转置
};
template  < typename  T>
void  inline  Swap(T &a, T &b)
{
     T tmp = a;
     a = b;
     b = tmp;
}
TSMatrix::TSMatrix( const  TSMatrix &other)
{
     rows = other.rows;
     cols = other.cols;
     nums = other.nums;
     for  ( int  i = 0; i<nums; i++)
     {
         data[i] = other.data[i];
     }
}
TSMatrix TSMatrix::Trans()  const  {   //求转置矩阵
     TSMatrix value;
     if  (nums != 0){
         for  ( int  k = 0; k<cols; k++)
         {
             for  ( int  w = 0; w<nums; w++)
             {
                 if  (data[w].j == k)
                 {
                     value.data[value.nums].i = data[w].j;
                     value.data[value.nums].j = data[w].i;
                     value.data[value.nums].data = data[w].data;
                     value.nums++;
                 }
             }
         }
     }
     return  value;
}
TSMatrix::TSMatrix(ElemType A[M][N])  //以二元数组构造稀疏矩阵
{
     rows = M;
     cols = N;
     nums = 0;
     for  ( int  i = 0; i<M; i++)
     {
         for  ( int  j = 0; j<N; j++)
         {
             if  (A[i][j] != 0)
             {
                 data[nums].i = i;
                 data[nums].j = j;
                 data[nums].data = A[i][j];
                 nums++;
             }
         }
     }
}
void  TSMatrix::print()  const
//打印
{
     for  ( int  i = 0; i<nums; i++)
     {
         printf ( "[  %d  |  %d  |  %d  ]\n" , data[i].i, data[i].j, data[i].data);
     }
}
bool  TSMatrix::SetValue( int  i,  int  j, ElemType x)
{
     int   k, w;
     if  (i >= rows || j >= cols)  return  false ;
     if  (x == 0)  //有可能出现设定值为0的情况(删除)
     {
         for  (k = 0; data[k].i<i || data[k].j<j&&k < nums; k++);
         if  (data[k].i == i&&data[k].j == j)
         {
             //删除第k个元素
             nums--;
             for  (w = k; w<nums; w++)
             {
                 Swap(data[w], data[w + 1]);
             }
             return  true ;
         }
         else   //本来就是0了
         {
             return  true ;
         }
     }
     else
     {
         for  (k = 0; data[k].i<i || data[k].j<j&&k < nums; k++);   //空循环直接查找待插入的位置
         if  (data[k].i == i&&data[k].j == j)
         {
             data[k].data = x;
             return  true ;
         }
         else
         {
             data[nums].data = x;
             data[nums].i = i;
             data[nums].j = j;
             nums++;
             for  (w = k; w<nums; w++)
             {
                 Swap(data[w], data[k]);
             }
             return  true ;
         }
     }
}
bool  TSMatrix::GetValue( int  i,  int  j, ElemType &x)  const
{
     int  k;
     if  (i >= rows&&j >= cols)  return  false ;
     for  (k = 0; k<rows&&data[k].i<i || data[k].j<j; k++);
     if  (data[k].i == i&&data[k].j == j)
     {
         x = data[k].data;
     }
     else  {
         x = 0;
     }
     return  true ;
}
int  main()
{
     ElemType A[M][N] =
     {
         { 0, 0, 1, 0, 0, 0, 0 },
         { 0, 2, 0, 0, 0, 0, 0 },
         { 3, 0, 0, 0, 4, 0, 0 },
         { 0, 0, 0, 5, 0, 0, 0 },
         { 0, 0, 0, 0, 6, 0, 0 },
         { 0, 0, 0, 0, 0, 7, 4 }
     };
     TSMatrix t = A;
     printf ( "三元组为:\n" );
     t.print();
     printf ( "设定2,0,1;2,3,9之后三元组为:\n" );
     t.SetValue(2, 0, 1);
     t.SetValue(2, 3, 9);
     t.print();
     printf ( "设定5,5,0;5,6,0之后三元组为:\n" );
     t.SetValue(5, 5, 0);
     t.SetValue(5, 6, 0);
     t.print();
     ElemType x;
     if  (t.GetValue(2, 4, x))  printf ( "[2,4]=%d\n" , x);
     if  (t.GetValue(1, 7, x))  printf ( "[1,7]=%d\n" , x);
     printf ( "转置矩阵三元组为:\n" );
     t.Trans().print();
     
     return  0;
}

转载于:https://www.cnblogs.com/xieyulin/p/7060857.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值