</pre><pre name="code" class="cpp"><span style="font-family: Arial, Helvetica, sans-serif;">#include <stdio.h></span>
#include <stdlib.h>
#define MAXSIZE 100 //非零元的最大个数
#define ElenType int
#define Status int//返回值类型
#define OK 1
#define ERROR 0
#define OVERFLOW -1
/*稀疏矩阵的三元组存储结构*/
typedef struct {
int row,col;//非零元的行下标和列下标
ElenType data;//元素的值
}Triple;
typedef struct {
Triple dataArray[MAXSIZE+1];//非零元组表,dataArray[0]未用
int row_count,col_count,data_count;//矩阵的行数,列数和非零元个数
}*TSMatrix,Matrix;//代表Triple Sequence Matrix 三元组矩阵
/*创建一个矩阵*/
Status CreateTSMatrix(TSMatrix &M){
M = (TSMatrix)malloc(sizeof(Matrix));
if(!M){
exit(OVERFLOW);
}
printf("输入三元组的行数,列数和非零元个数:");
int rc,cc,dc;
scanf("%d%d%d",&rc,&cc,&dc);
M->row_count = rc;
M->col_count = cc;
M->data_count = dc;
int i = 0;
printf("开始构造矩阵\n");
int r,c,d;//作为临时变量
while(i<dc){
printf("输入第%d个非零元的行号,列号和值:",i+1);
scanf("%d%d%d",&r,&c,&d);
if(r>rc || c>cc){ //行和列不能越界
printf("此组数据不合法,请重新输入\n");
continue;
}else{
//因为下标从1 开始,所以i+1
M->dataArray[i+1].row = r;
M->dataArray[i+1].col = c;
M->dataArray[i+1].data = d;
i++;//此时才++
}
}
printf("构造矩阵成功\n");
return OK;
}
/*打印三元组矩阵*/
Status PrintTSMatrix(TSMatrix M){
//此方法只适合于行列都从小到大排好序的dataArray数组
/* int rc,cc,dc;
rc = M->row_count;
cc = M->col_count;
int k = 1;
for(int i = 1;i <= rc;i++){
for(int j = 1;j <= cc;j++){
if(i==M->dataArray[k].row && j == M->dataArray[k].col){
printf("%d ",M->dataArray[k].data);
k++;
}else{
printf("0 ");
}
}
printf("\n");
}*/
//所以还是用描述法吧
for(int i=1;i<=M->data_count;i++){
printf("行号 列号 值:%d %d %d",M->dataArray[i].row,M->dataArray[i].col, M->dataArray[i].data);
printf("\n");
}
return OK;
}
/*使用暴力法转置*/
Status BruseTranspose(TSMatrix &M_from,TSMatrix &M_to){
//分配空间
M_to = (TSMatrix)malloc(sizeof(Matrix));
M_to->row_count = M_from->col_count;
M_to->col_count = M_from->row_count;
M_to->data_count = M_from->data_count;
//若有非零元才转置
if(M_to->data_count ){
int to_index = 1;//to矩阵的数组游标
for(int row = 1;row <= M_to->row_count;row++){
for(int d = 1;d <= M_to->data_count;d++){
if(M_from->dataArray[d].col == row){
M_to->dataArray[to_index].row = M_from->dataArray[d].col;
M_to->dataArray[to_index].col = M_from->dataArray[d].row;
M_to->dataArray[to_index].data = M_from->dataArray[d].data;
++to_index;
}
}
}
}
return OK;
}
/*
*快速转置法,借助num和cpot两个数组,num[col]表示矩阵M中第col列的非零元个数
*cpot[col]表示第col列的第一个非零元在转置后的矩阵T.dataArray数组中的合适位置
*其中:cpot[1]=1;cpot[col] = cpot[col-1]+num[col-1];
*/
Status FastTranspose(TSMatrix M,TSMatrix &T){
T->col_count = M->row_count;
T->row_count = M->col_count;
T->data_count = M->data_count;
int col,*num,*cpot;
num = cpot = (int*)malloc(sizeof(int)*M->col_count);
if(!num){
exit(OVERFLOW);
}
if(T->data_count){
for(col=1;col<=T->col_count;col++){//初始化为0
num[col] = 0;
}
for(int i=1;i<M->data_count;i++){
++num[M->dataArray[i].col];//遍历非零元,求得每一列非零元个数
}
cpot[1] = 0;
for(col=2;col<=M->col_count;col++){
cpot[col] = cpot[col-1]+num[col-1];
}
int t;
for(int p=1;p<=M->data_count;p++){
col = M->dataArray[p].col;//取出这一个非零元的列数
t = cpot[col];//找到此非零元在T.dataArray的位置
//交换赋值
T->dataArray[t].row = M->dataArray[p].col;
T->dataArray[t].col = M->dataArray[p].row;
T->dataArray[t].data = M->dataArray[p].data;
++cpot[col];//将位置往后挪,因为同一列的元素可能不止一个
}
}
return OK;
}
int main(){
TSMatrix M;
CreateTSMatrix(M);
printf("原始矩阵:\n");
PrintTSMatrix(M);
TSMatrix T;
BruseTranspose(M,T);
printf("暴力法转置:\n");
PrintTSMatrix(T);
FastTranspose(M,T);
printf("快速转置:\n");
PrintTSMatrix(T);
return 0;
}
运行结果: