//稀疏矩阵的存储方法--三元组表
//1.三元组表的顺序表存储
#define MAXSIZE 1000
typedef int ElemType;
typedef struct{
int i,j;//第i行第j列
ElemType e;//非零值
}Triple;//三元组类型
typedef struct{
Triple data[MAXSIZE+1];
int m,n,t;//m行,n列,t个非0元
}TSMtrix;//稀疏矩阵类型
//经典转置算法
Status TransMatrix(TSMatrix M,TSMatrix &T)
{//采用三元组表存储表示,求稀疏矩阵M的转置矩阵T
T.m=M.n;T.n=M.m;T.t=M.t;
if(T.t!=0)//当存在非0元素时执行转置
{
q=1;//记录T中的元素个数
for(col=1;col<=M.n;col++)//按列号从小到大循环
for(p=1;p<=M.t;p++)//p用于扫描M.data中的所有元素
if(M.data[p].j==col)//找到一个列号为col的元素,将行,列交换后添加到T中
{
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++;//T中元素的个数增1
}
}
return OK;
}//TransMatrix时间复杂度为O(n*t)
//快速转置算法
Status FastTrans(TSMatris M,TsMatris &T)
{
T.m=M.n;T.n=M.m;T.t=M.t;
if(T.t!=0)//当存在非0元素时执行转置
{
int col,num_1[M.n],num_2[M.n];//引入两个数组,分别存放M某列非0元素的个数及位置
for(col=1;col<=M.n;col++)//按列号从小到大循环
{
num_1[col]=0;
}
for(int i=1;i<=M.t;i++)//i用于扫描M.data中的所有元素
{
num_1[M.data[i].j]++;
}
num_2[1]=1;
for(col=2;col<=M.n;col++)
{
num_2[col]=num_2[col-1]+num_1[col-1];
}
for(int k=1;k<=M.t;k++)
{
col=M.data[k].j;
int s=,num_2[col];
T.data[s].i=M.data[t].j;
T.data[s].j=M.data[t].i;
T.data[s].e=M.data[t].e;
num_2[col]++;//T中元素的个数增1
}
}
return OK;
}//FastTrans时间复杂度为O(n+t)
//2.十字链式存储
typedef struct OLNode
{
int i,j;//该非0元素的行和列下标
ElemType e;
struct OLNode *right,*down;//非0元素所在的行表和列表的后继链域
}OLNOde,*OLink;
typedef sturct
{
OLink *rhead,*chead;//行和列链表头指针向量
int m,n,t;//稀疏矩阵的行数,列数和非0元个数
}CrossList;