前言
- 按照壓縮存儲的概念,只存儲稀疏矩陣的非零元;
- 一個三元組即可確定矩陣M的一個非零元;
- 主要有三種方法存儲稀疏矩陣:三元組順序表、行邏輯鏈接的順序表、十字鏈表。
三元組順序表
結構體和頭文件
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 12500
typedef struct {
int i, j; // 非零元的行號,列號
int e;
}Triple;
typedef struct {
Triple data[MAXSIZE+1];
int mu, nu, tu; //矩陣的行數,列數,非零元個數
}TSMatrix;
創建和存儲稀疏矩陣
//創建稀疏矩陣
void create(TSMatrix *M, int mu, int nu, int tu) {
(*M).mu = mu;
(*M).nu = nu;
(*M).tu = tu;
M = (TSMatrix *) malloc (tu * sizeof(Triple));
}
//壓縮存儲稀疏矩陣
void init(TSMatrix *M) {
for(int n = 1; n <= (*M).tu; n++) {
printf("輸入第%d個非零元,格式為“行號 列號 值”(空格隔開):", n);
int row, col, value;
scanf("%d %d %d", &row, &col, &value);
(*M).data[n].i = row;
(*M).data[n].j = col;
(*M).data[n].e = value;
}
}
打印矩陣在終端
//打印稀疏矩陣
//方法一
//先將壓縮稀疏矩陣轉化為普通稀疏矩陣
//再用兩層for循環,以矩陣(表格)形式輸出
//方法二,直接輸出,沒有格式
void display_TSMatrix(TSMatrix M) {
// for (int row = 1; row <= M.mu; row++) {
// for (int col; col <= M.nu; col++) {
// printf("%3d", M.data[mu*(row-1)+col].e);
// }
// printf("\n");
// }
for (int n = 1; n <= M.tu; n++) {
printf("(%d,%d,%d)\n", M.data[n].i, M.data[n].j, M.data[n].e);
}
printf("\n\n");
}
對矩陣的轉置
//對壓縮稀疏矩陣M轉置,並返回轉置后的壓縮稀疏矩陣
TSMatrix TransposeSMatrix(TSMatrix M) {
TSMatrix T;
create(&T, M.nu, M.mu, M.tu);
if(T.tu) {
int q = 1;
for (int col = 1; col <= M.mu; ++col)
for (int p = 1; p <= M.tu; ++p)
if(M.data[p].j == col) {
T.data[q].i = M.data[p].j;
T.data[q].j = M.data[p].i;
T.data[q].e = M.data[p].e;
++q;
}
}
return T;
}
快速轉置法
//對壓縮稀疏矩陣M的轉置第二種方法
TSMatrix FastTransposeSMatrix(TSMatrix M) {
TSMatrix T;
create(&T, M.nu, M.mu, M.tu);
int num[M.tu], cpot[M.tu];
if (T.tu != 0){
for(int col=1; col <= M.nu; ++col)
num[col] = 0;
for(int t = 1; t<=M.tu; ++t)
++num[M.data[t].j];
cpot[1]= 1;
for(int col = 2; col <= M.nu; ++col)
cpot[col] = cpot[col-1] + num[col-1];
for(int p=1; p<= M.tu; ++p){
int col = M.data[p].j;
int q = cpot[col];
T.data[q].i = M.data[p].j;
T.data[q].j = M.data[p].i;
T.data[q].e = M.data[p].e;
++ cpot[col];
}
}
return T;
}
主函數
int main() {
TSMatrix M;
int m_mu, m_nu, m_tu;
printf("輸入稀疏矩陣的行數、列數和非零元個數(以英文逗號隔開):");
scanf("%d,%d,%d", &m_mu, &m_nu, &m_tu);
create(&M, m_mu, m_nu, m_tu);
init(&M);
printf("矩陣M: \n");
display_TSMatrix(M);
TSMatrix T = TransposeSMatrix(M);
printf("M轉置后的矩陣為:\n");
display_TSMatrix(T);
return 0;
}
輸入、輸出

行邏輯鏈接的順序表
待續
十字鏈表
待續