//稀疏矩阵的转置
//使用了两个辅助数组
//num : num[j] : 矩阵A中第j列非零元素的个数
//cpot : cpot[j]: 矩阵A中第j列的第一个非零元素在其转置矩阵B的三元组顺序表的位置。
//推出2个规则:
//1 cpot[1] = 1;
//2 cpot[j] = cpot[j-1]+num[j-1];
//算法思路:
//根据1,2规则计算num数组和cpot数组
//根据cpot数组的指示求转置,将A的三元组顺序表中每个元素直接放入B的三元组顺序表中的适当位置.
#define max 100
struct element
{
int row,col; //行下标,列下标
int value; //值
};
struct triple
{
int m; //行数
int n; //列数
int t; //非0元素个数
element list[max+1]; //存放的位置
};
void transpos(triple &A,triple &B)
{//求A的转置数组B
int num[max+1]; //A每列非0元素的个数
int cpot[max+1];//A的某列非0元素在B的三元组中的位置
//基本信息的复制
B.m = A.n;
B.n = A.m;
B.t = A.t;
if(B.t>0)
{//如果存在非0的元素,这个时候才需要转置
//初始化num数组 num[j] : j列中非0元素的个数
//初始化
for(j=1;j<=A.n;j++)
{
num[j] = 0;
}
//求A中每一列中非0元素的个数
for(j=1;j<=A.t;j++)
{
num[A.list[j].col]++; //
}
//num已经初始化好了
//初始化cpot;
cpot[1] = 1;
for(j=2;j<=A.n;j++)
{
cpot[j] = cpot[j-1] +num[j-1];
}
//cpot也初始化好了
//求转置
for(p=1;p<=A.t;p++)
{
j = A.list[p].col; //j是某元素的列数
i = cpot[j]; //i是A的j列应该存储在B的三元组的首位
B.list[i].row = A.list[p].col;
B.list[i].col = A.list[p].row;
B.list[i].data =A.list[p].value;
cpot[j]++;
}
}
}