头文件
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW 0
typedef int ElemType;
typedef int Status;
结构体
typedef struct {
int i,j ; //非零元的行和列
ElemType e ; //非零元的值
} Triple; //三元组
typedef struct {
Triple *data; //非零元三元组表。0号单元未用
int mu ,nu ,tu ; //矩阵的行数、列数和非零元的个数
} TSMatrix ; //三元组顺序表
//num[j]统计矩阵A的a.data中第j列非零元素的个数
//cpos[j]表示矩阵A的a.data中第j列的第一个非零元在b.data中的起始位置
//矩阵A中第j列的起始位置等于第j-1列的起始位置加上第j-1的非零元的个数
矩阵的快速转置
Status FastTransposeSMatrix(TSMatrix M,TSMatrix &T){
//采用三元组表存储表示,求稀疏矩阵M的转置矩阵T
int j, q,k,p;
int *num ,*cpos;
T.mu = M.nu; T.nu=M.mu; T.tu=M.tu;
if(T.tu!=0){
T.data = (Triple *)malloc((T.tu+1) * sizeof(Triple));
num = (int *)malloc((M.tu +1)*sizeof(int));
cpos = (int *)malloc((M.tu +1)*sizeof(int));
if(NULL==T.data || NULL==num || NULL==cpos)
return OVERFLOW;
for(j=1;j<=M.nu;++j)
num[j]=0;
for ( k = 1; k <= M.tu; ++k) //求M中每一列所含非零元的个数
++num[M.data[k].j];
//M.data[k].j代表原三元组的第k组数据的列在第几列
cpos[1]=1;
for(j = 2; j<= M.nu; ++j) //求每一列的第一个非零元在b.data中的序号
cpos[j]= cpos[j-1] + num[j-1];
for(p=1; p<=M.tu; ++p){ //转置矩阵元素
j=M.data[p].j; //j等于M中第p组的列
q=cpos[j]; //q等于M中第p组的数据在T中的位置
T.data[q].i = M.data[p].j; //T中第q组的行等于M中的第p组的列
T.data[q].j = M.data[p].i; //T中第q组的列等于M中的第p组的行
T.data[q].e = M.data[p].e;
//如过一列中有多组数据就需要用上下一行操作
++cpos[j]; //更新为第j列下一个非零元的位置
}
}
free(num);
free(cpos);
return OK;
}
创建稀疏矩阵
//这个创建粗糙无比,只是单纯为了创建一个出来验证结果而已
Status CreateSMatrix(TSMatrix &M){
M.mu=4;
M.nu=8;
M.tu=4;
M.data=(Triple *)malloc((M.tu+1) * sizeof(Triple));
M.data[1].i=1;
M.data[1].j=6;
M.data[1].e=2;
M.data[2].i=1;
M.data[2].j=7;
M.data[2].e=3;
M.data[3].i=2;
M.data[3].j=1;
M.data[3].e=5;
M.data[4].i=3;
M.data[4].j=6;
M.data[4].e=9;
return OK;
}
输出稀疏矩阵
void PrintSMatrix(TSMatrix M){
for(int i=1;i<=M.tu;i++){
printf("%d ",M.data[i].i);
printf("%d ",M.data[i].j);
printf("%d ",M.data[i].e);
printf("\n");
}
}
main函数
int main (){
TSMatrix M,T;
CreateSMatrix(M);
printf("稀疏矩阵:\n");
PrintSMatrix(M);
FastTransposeSMatrix(M,T);
printf("转置矩阵:\n");
PrintSMatrix(T);
return 0;
}
结果