【数据结构】:
typedef int ElementType;
typedef struct{
int row,col; //行和列
ElementType e; //非零元素的值
}Triple;
typedef struct{
Triple data[MAXSIZE+1]; //非零元素的三元组表。
int m,n,len; //矩阵的行数,列数和非零元素的个数
}TSMatrix;
【算法思想】:
(一)首先我编写了一个二维数组,用来容纳稀疏矩阵。
(二)然后再把稀疏矩阵的非零元素添加到三元组中。
(三)最后我们在把三元组的元素转置到新的三元组中。 这个过程中使用了一次性定位快速转置法,具体算法思想如下:
一次性定位快速转置法可以通过一重循环来完成,可以使原三元组的非零元一次性定位放到新三元组表中正确的位置。
使用这个方法前,首先我们要先计算以下数据: 在下面的代码中,我们使用了num[col]和position[col]两个数组。
粗略来说。 num用来存放原表第col列中非零元素总个数。
Position:第col列中第一个非零元素在新三元组表中的存储位置。(下标值)
【算法描述】:
//将矩阵的数据转置到三元组表中。
int zipMatrix(int arr[jie][jie],Triple *t,TSMatrix &tm){
tm.len=1;
for(tm.m=0;tm.m<jie;tm.m++){
for(tm.n=0;tm.n<jie;tm.n++){
if(arr[tm.m][tm.n]!=0){
t->row=tm.m+1;
t->col=tm.n+1;
t->e=arr[tm.m][tm.n];
tm.data[tm.len].row=tm.m+1;
tm.data[tm.len].col=tm.n+1;
tm.data[tm.len].e=arr[tm.m][tm.n];
tm.len++;
t++;
}
}
}
tm.m+=1;
tm.n+=1;
return tm.len;
}
//一次定位快速转置算法
TSMatrix FastTransposeTSMatrix(TSMatrix A,TSMatrix B,int len){
int col,t,p,q,k;
int num[MAXSIZE],position[MAXSIZE];
B.len=A.len;B.n=A.m;B.m=A.n;
if(B.len){
//每次循环前,先把内容置零
for(col=1;col<=A.n;col++)
num[col]=0;
//采用数组下标计数法计算每一列的非零元素个数。
for(t=1;t<A.len;t++){
num[A.data[t].col]++;
}
position[1]=1; //第一列的位置转置后为1
//求出col列中第一个非零元素在B.data[]中的正确位置
for(col=2;col<=A.len;col++){
position[col]=position[col-1]+num[col-1];
}
//将被转置矩阵的三元组表A从头至尾扫描一次,实现矩阵转置
for(p=1;p<=A.len;p++){
col=A.data[p].col;
q=position[col];
B.data[q].row=A.data[p].col;
B.data[q].col=A.data[p].row;
B.data[q].e=A.data[p].e;
position[col]++; //加一,使之指向下一个列号为col的非零元素在三元组表B中存放的位置。
}
}
printf("\n");
return B;
}
//遍历数据
void cha(TSMatrix tm,int len){
for(int k=1;k<len;k++){
// printf("(%d,",t[k].row);
// printf("%d,",t[k].col);
// printf("%d)",t[k].e);
printf("(%d,",tm.data[k].row);
printf("%d,",tm.data[k].col);
printf("%d)",tm.data[k].e);
}
printf("\n");
}
//最后只要在主函数调用即可
int main(){
//首先,我需要先定义一个稀疏矩阵
int arr[jie][jie]={
{0,3,0,7,0,9},
{7,3,8,0,0,0},
{0,4,0,8,0,0},
{6,0,0,5,0,1},
{0,0,3,0,1,0},
{3,0,0,0,7,0}
};
//初始化三元组
Triple t[MAXSIZE]={};
Triple *T=t;
TSMatrix tm;
TSMatrix ztm;
//把二维稀疏矩阵的数据添加到三元组中
int len = zipMatrix(arr,T,tm);
printf("三元组转置前:\n");
//查询输出数据
cha(tm,len);
printf("\n");
//新建了一个三元组表,调用转置的方法
ztm = FastTransposeTSMatrix(tm,ztm,len); //这里建议用指针
printf("三元组转置后:\n");
//查询输出数据
cha(ztm,len);
return 0;
}
最后运行的示意图:
源码下载: