对于稀疏矩阵,采用压缩存储方法时,只存储非0元素。必须存储非0元素的行下标值、列下标值、元素值。因此,一个三元组(i, j, aij)唯一确定稀疏矩阵的一个非零元素。
若以行序为主序,稀疏矩阵中所有非0元素的三元组,就可得构成该稀疏矩阵的一个三元组顺序表。
代码:
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR -1
#define MAXSTRLEN 255
typedef int Status;
typedef int ElemType;
typedef struct{
int row; //行下标
int col; //列下标
ElemType value; //元素值
}Triple;
typedef struct{
int rn; //行数
int cn; //列数
int tn; //元素值
Triple data[MAXSTRLEN];
}TMatrix;
void TransMatrix(TMatrix A, TMatrix *B){
int p, q, col;
B->cn = A.rn;
B->rn = A.cn;
B->tn = A.tn;
if(A.tn == 0)
printf("A表为空表");
q = 0;
for(col = 0; col < A.tn; col++){
//A的列数 一列一列变成B的行数
for(p = 0; p < A.tn; p++){
//循环次数是非零元素的个数
if(A.data[p].col == col){
B->data[q].row = A.data[p].col;
B->data[q].col = A.data[p].row;
B->data[q].value = A.data[p].value;
q++;
}
}
}
}
int main()
{
TMatrix A, B;
int i, j, e;
int k = 0;
printf("输入三元组 矩阵(行数,列数,值)\n");
//EOF 输入结束 下一行Ctrl+z enter
while(scanf("%d%d%d", &i,&j,&e) != EOF ){
A.data[k].row = i -1;
A.data[k].col = j-1;
A.data[k].value = e;
k++;
A.tn = k;
}
printf("矩阵为\n");
for(i = 0; i < A.tn; i++){
printf("%3d%3d%3d\n", A.data[i].row+1, A.data[i].col+1, A.data[i].value);
} printf("转置后:\n");
TransMatrix(A, &B);
for(i = 0; i < B.tn; i++){
printf("%3d%3d%3d\n", B.data[i].row+1, B.data[i].col+1, B.data[i].value);
}
return 0;
}
结果: