数据结构第五章--数组和广义表

一、三元组顺序表

假设以顺序存储结构来表示三元组表,则可得稀疏矩阵的一种压缩存储方式——我们成之为三元组顺序表。

稀疏矩阵的三元组顺序表存储表示
#define MAXSIZE 12500 //假设非零元个数的最大值为12500
typedef struct {
int i, j; //该非零元的行下标和列下标
ElemType e;
}Triple;

typedef unicon{
Triple data[MAXSIZE+1]; //非零元三元组表,data[0]未用
int mu, nu, tu; //矩阵的行数、列数和非零元个数
}TSMatrix;

矩阵的转置:a->b

为了实现将三元组在转置时就能够知道转置后应该在的存储位置,需要附设num和cpot两个变量。num[col]表示矩阵M中第col列中非零元的个数,cpot[col]指示M中第col列的第一个非零元在b.data中的恰当位置。显然有
cpot[1] = 1;
cpot[col] = cpot[col - 1] + num[col - 1]; 2<=col<=a.nu

三元组顺序表又称有序的双下标法,它的特点是,非零元在表中按行序有序存储,因此便于进行依行顺序处理的矩阵运算。然而,若需按行号存储某一行的非零元,则需从头开始进行查找。为了便于随机存取任意一行的非零元,则需知道每一行的第一个非零元在三元组表中的位置。为此,可将指示“行”信息的辅助数组cpot固定在稀疏矩阵的存储结构中。称这种“带行链接信息”的三元组表为行逻辑链接顺序表。

行逻辑链接的顺序表

typedef struct{
Tripple data[MAXSIZE+1]; //非零元三元组表
int rpos[MAXRC+1]; //各行第一个非零元的位置表
int mu, nu, tu; //矩阵的行数、列数和非零元个数
}RLSMatrix;

#include <iostream>
using namespace std;




#define MAXSIZE 1250  


#define    OK      1  
#define    ERROR   0  
#define    TRUE    1  
#define    FLASE   0  


typedef    int     Status;  
typedef    int     ElemType;  


typedef struct{  
    int   i, j;       //该非零元的行下标和列下标  
    ElemType e;       //非零元对应的值  
}Triple;  


typedef struct{  
    Triple   data[MAXSIZE+1];       //非零元三元组表,data[0]未用  
    int      mu, nu, tu;            //矩阵的行数,列数,非零元个数  
}TSMatrix;


Status FastTransposeSMatrix(TSMatrix M, TSMatrix &T)              //快速转置  
{                                                      //采用三元组顺序表存储表示,求稀疏矩阵M的转置矩阵T  
    T.mu=M.nu;  
    T.nu=M.mu;  
    T.tu=M.tu;  
    if(T.tu)  
    {  
        int col;  
        int num[100], cpot[100];  
        for(col=1;col<=M.nu;++col)  
            num[col]=0;                 //num数组的初始化  
        for(int t=1;t<=M.tu;++t)  
            ++num[M.data[t].j];         //求M中每一列含有的非零元个数  
        cpot[1]=1;  
        for(col=2;col<=M.nu;++col)  
            cpot[col]=cpot[col-1]+num[col-1];         //求cpot向量  
        int q;  
        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];  
        }//for  
    }//if  
    return OK;  
}//FastTransposeSMatrix  


int _tmain(int argc, _TCHAR* argv[])
{
    TSMatrix M;  
    TSMatrix T;  
    printf("请输入原矩阵:\n");  
    printf("行数、列数: ");  
    scanf("%d%d", &M.mu, &M.nu);  
    printf("元素总数: ");  
    scanf("%d",&M.tu);  
    printf("输入各个对应压缩值:\n");  
    for(int i=1;i<=M.tu;++i)  
        scanf("%d%d%d", &M.data[i].i, &M.data[i].j, &M.data[i].e);  


    FastTransposeSMatrix(M, T);  


    printf("转置后行数、列数、元素总数非别为:\n%d     %d     %d\n\n", T.mu, T.nu, T.tu);  
    printf("值为:\n");  
    for(int t=1;t<=T.tu;++t)  
        printf("%d     %d     %d\n", T.data[t].i, T.data[t].j, T.data[t].e);  


return 0;
}
转自http://blog.csdn.net/slience_perseverance/article/details/7015982


http://blog.csdn.net/qjdg_01/article/details/8282629

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值