一、三元组顺序表
假设以顺序存储结构来表示三元组表,则可得稀疏矩阵的一种压缩存储方式——我们成之为三元组顺序表。
稀疏矩阵的三元组顺序表存储表示
#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;
}
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