代码演示:
// δ=t/(n?m) <= 0.05 则证明是稀疏矩阵
/* 稀疏矩阵的类型说明及转置算法 */
#include<stdio.h>
#include<stdlib.h>
#define MAX 12
typedef int datatype;
typedef struct{
int i, j; // 行号、列号
datatype v; // 元素值
} node;
typedef struct{
int m, n, t; // 行数,列数,非零元素个数
node data[MAX]; // 三元组表
}spMatrix;
spMatrix *Create(); // 创建一个n行m列的稀疏矩阵
spMatrix *TransMat(spMatrix *a); //稀疏矩阵的转置
void Output(spMatrix *a); //在屏幕上以行列的形式输出矩阵
int main(){
printf("输入行列数:\n");
spMatrix *a = Create();
spMatrix *b = TransMat(a);
printf("原矩阵:\n");
Output(a);
printf("转置矩阵:\n");
Output(b);
return 0;
}
spMatrix *Create(){ // 创建一个稀疏矩阵
int m , n , k = 0, t = 0;
scanf("%d%d",&m,&n);
datatype element;
spMatrix *matrix;
matrix = (spMatrix *)malloc(sizeof(spMatrix)); //创建一个稀疏矩阵a
matrix->m = m;
matrix->n = n;
printf("输入%d行,%d列元素:\n",m,n);
while (k < m*n){
scanf("%d", &element);
if (element != 0){
matrix->data[t].i = k / n;
matrix->data[t].j = k % n;
matrix->data[t].v = element;
t++;
}
k++;
}
matrix->t = t;
return matrix;
}
spMatrix *TransMat(spMatrix *a){ // 稀疏矩阵的转置
int p, q, bno = 0;
spMatrix *b;
b = (spMatrix *)malloc(sizeof(spMatrix)); //为矩阵b分配内存空间
b->m = a->n;
b->n = a->m;
b->t = 0;
if (a->t == 0) // 若b中元素全为零,则将b返回
return b;
for (p = 0; p < a->n; p++)
for (q = 0; q < a->t; q++)
if (a->data[q].j == p){
b->data[bno].i = a->data[q].j;
b->data[bno].j = a->data[q].i;
b->data[bno].v = a->data[q].v;
bno++;
}
b->t = bno;
return b;
}
void Output(spMatrix *a){
//输出:在屏幕上以行列的形式输出矩阵
int i = 0, j = 0, k = 0;
for (i = 0; i < a->m; i++){
for (j = 0; j < a->n; j++){
if (i == a->data[k].i && j == a->data[k].j){
printf("%d ", a->data[k].v);
k++;
}
else
printf("%d ", 0);
}
printf("\n");
}
}
效果展示: