数据结构--数组和广义表--以三元组顺序表存储方式的矩阵的一般转置和快速转置

稀疏矩阵有三种表示方式:1,三元组顺序表  2,行逻辑连接的顺序表  3,十字链表。

矩阵的一个非零元可以由一个三元组(i,j,e)唯一确定,由此稀疏矩阵可以由表示非零元的三元组及其行列数唯一确定。下面代码为以三元组顺序表为存储结构的基本操作,其中快速转置的思想是预先确定原矩阵的每一列的非零元个数,在执行转置时候可以随即插入。

//三元组顺序表来存储矩阵并进行矩阵的转置

typedef int Elemtype ;
const int MAXSIZE=12500;
const int MAXNUM=20;

typedef struct{
    int i,j;  //该非零元的行下标和列下标
    Elemtype e;  //非零的值
} Triple;
typedef struct{
    Triple data[MAXSIZE+1];  //非零元的三元组表,data【0】未使用
    int mu,nu,tu;  //分别表示矩阵行数,列数,非零元的个数
}TSMatrix;

//初始化三元组顺序表并输入行数和列数和非零元的个数
Status InitTSMatrix(TSMatrix & M,int mu,int nu,int tu){
    if(tu>(mu*nu)) return ERROR;
    M.mu=mu; M.nu=nu; M.tu=tu;
    int i,j,e;
    for(int k=1;k<=M.tu;++k){
        cout<<"Please input the 'rownumber' 'colnumber' and 'the value' of number "<<k<<":";
        cin>>i>>j>>e;
        if(i>0&&i<=mu&&j>0&&j<=nu){
            M.data[k].i=i;
            M.data[k].j=j;
            M.data[k].e=e;
        }else return ERROR;
    }
    return OK;
}

Status TransposeSTMatrix(TSMatrix M,TSMatrix &T){
    T.mu=M.nu; T.nu=M.mu; T.tu=M.tu;
    if(!T.tu) return ERROR;
    int q=1;
    for(int col=1;col<=M.nu;++col){
        for(int p=1;p<=M.tu;++p){
            if(M.data[p].j==col){
                T.data[q].i=M.data[p].j;
                T.data[q].j=M.data[p].i;
                T.data[q].e=M.data[p].e;
                ++q;
            }
        }
    }
    return OK;
}

//快速转置矩阵方法
Status FastTransposeSMatrix(TSMatrix M,TSMatrix & T){
    //采用三元组顺序表存储表示,求稀疏矩阵M的转置矩阵T
    T.mu=M.nu; T.nu=M.mu; T.tu=M.tu;
    if(!T.tu) return ERROR;
    int num[MAXNUM];//?????
    for(int col=1;col<=M.nu;++col) num[col]=0;
    for(int t=1;t<=M.tu;++t) ++num[M.data[t].j];
    int cpot[MAXNUM];
    cpot[1]=1;
    //求第col列中第一个非零元在T.data中的序号
    for(int col=2;col<=M.nu;++col)
        cpot[col]=cpot[col-1]+num[col-1];
    int q,col;
    for(int p=1;p<=M.tu;++p){
        col=M.data[p].j; q=cpot[col];
        T.data[q].i=M.data[p].j;
        T.data[q].j=M.data[p].i;
        T.data[q].e=M.data[p].e;
        ++cpot[col];
    }
    return OK;
}

void DisTRSMatrix(TSMatrix m){
    cout<<"The TSMatrix is:"<<endl;
    for(int k=1;k<=m.tu;++k){
        cout<<m.data[k].i<<" "<<m.data[k].j<<" "<<m.data[k].e<<endl;
    }
}
int main()
{
    TSMatrix m,t;
    InitTSMatrix(m,6,7,8);
    //TransposeSTMatrix(m,t);
    FastTransposeSMatrix(m,t);
    DisTRSMatrix(t);
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值