三元组基本算法

#include <iostream>

using namespace std;
struct TupNode{
    int row;//行号
    int col;//列号
    int d;//元素值
};
const int MAXR=20;//最大行数
const int MAXC=20;//最大列数
const int MaxSize=100;//三元组顺序表的最大元素个数
class SMatrix {
public:
SMatrix();//构造函数
~SMatrix();//析构函数
void CreateTSMatrix(const int A[][MAXC], int m, int n);//创建三元组
bool Setvalue(int i, int j, int x);//三元组元素赋值
bool Getvalue(int i, int j, int&x);//将指定位置的元素赋给变量
void DispMat();//输出
void Transpose(SMatrix&tb);//矩阵转置
private:
int rows, cols, nums;//分别表示行数,列数和非零元素个数
TupNode*data;//稀疏矩阵对应的三元组顺序表
};

//构造函数
SMatrix::SMatrix()
{
    data=new TupNode[MaxSize];
}
//析构函数
SMatrix::~SMatrix()
{
    delete[]data;
//输出
void SMatrix::DispMat()
{
    int i;
    if(nums<=0)
     return;
    cout<<"\t"<<rows<<"\t"<<cols <<"\t"<<nums <<endl;
    cout<<"\t \n";
    for(i=0;i<nums;i++)
    cout<<"\t"<< data[i]. row<<"\t"<< data[i]. col<<"\t"<< data[i]. d<< endl;
}
void SMatrix::CreateTSMatrix(const int A[][MAXC], int m, int n)
{
   int i,j;
   rows=m, cols=n, nums=0;
   for(i=0;i<m;i++)
     for(j=0;i<n;i++)
       if(A[i][j]!=0)//只存储非零元素
       {
           data[nums]. row=i;
           data[nums]. col=j;
           data[nums]. d=A[i][j];
           nums++;
        }
}
bool SMatrix::Setvalue(int i, int j, int x)
{
    int k =0,k1;
    if( i<0||i>=rows||j<0||j>=cols)
    {return false;}
    while(k<nums &&i>data[k]. row)//查找第i行的第1个非零元素k++;
    if(data[k]. row==i&&data[k]. col==j)//找到这样的元素data[k]. d= x;
    {
        data[k].d=x;
    }
    else {//当不存在这样的元素时插入一个元素
    for (k1=nums-1;k1>=k;k1--)
    {//后移元素以便插入
        data[k1+1]. row=data[k1]. row;
        data[k1+1]. col=data[k1]. col;
        data[k1+ 1]. d= data[k]. d;
    }
       data[k]. row=i;
       data[k]. col=j;
       data[k]. d =x;
       nums++;
}
return true;
}
//将指定位置的元素赋给变量
bool SMatrix::Getvalue(int i, int j, int&x)
{
    int k = 0;
    if(i<0||i>=rows||j<0||j>=cols)
    {return false;}
    while (k<nums &&data[k]. row<i)
    {
        k++;
    }
    if(data[k]. row==i&&data[k].col==j)
    {
        x=data[k].d;
    }
    else
    x =0;
    return true;
}
void SMatrıx::Transpose(SMatrıx&tb)
{
    int p,q =0,v;
    tb. rows=cols;
    tb. cols=rows;
    tb. nums =nums;
    if(nums!=0)
    {
        for(v=0;v<cols;v++)
          for(p=0;p<nums;p++)
            if(data[p]. col==v)
            {
               tb. data[q]. row=data[p]. co;
               tb. data[q]. col=data[p]. row;
               tb. data[q]. d= data[p]. d;
               q++;
            }
    }
}

int main()

{

    return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ww8821

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值