行逻辑链接
—— 头文件
#include <stdio.h>
#define number 5 // 代表有四个非零元素
#define NUM 4 // 代表有三行
结构体声明三元组和稀疏矩阵
// 结构体声明三元组节点
typedef struct {
int i, j;
int data;
} triple;
// 结构体声明稀疏矩阵节点
typedef struct {
triple data[number];
int rpos[NUM];
int n, m, num;
} TSMatrix;
构造增添三元组元素的函数
int index = 1; // 全局变量(记录三元组的索引值)
// 填充三元组内容
void appendElement(TSMatrix *thisM, int i, int j, int data){
thisM->data[index].i = i;
thisM->data[index].j = j;
thisM->data[index].data = data;
index++;
}
构造展示稀疏矩阵的函数
// 输出存储的稀疏矩阵
void display(TSMatrix M){
for(int i = 1; i <= M.m; i++){ // 行
for(int j = 1;j <= M.n; j++){ // 列
int value = 0;
// 位于第一行和第二行的元素
if(i+1 <= M.m){
for(int k = M.rpos[i]; k < M.rpos[i+1]; k++){ // 判断第一行元素时只比较三元组前二个位置
if(i == M.data[k].i && j == M.data[k].j){ // 证明找到非零元素
printf("%d ", M.data[k].data); // 输出非零元素
value = 1;
break;
}
}
if(value == 0){
printf("0 ");
}
}else{
for(int k = M.rpos[i]; k <= M.num; k++){
if(i == M.data[k].i && j == M.data[k].j){ // 证明找到非零元素
printf("%d ", M.data[k].data); // 输出非零元素
value = 1;
break;
}
}
if(value == 0){
printf("0 ");
}
}
}
printf("\n");
}
}
—— 主函数
int main() {
TSMatrix M;
M.m = 3; // 三行
M.n = 4; // 四列
M.num = 4; // 三个非零元素
M.rpos[1] = 1; // 第一行的第一个非零元素位于三元组的第 1个位置
M.rpos[2] = 3; // 第二行的第一个非零元素位于三元组的第 3个位置
M.rpos[3] = 4; // 第三行的第一个非零元素位于三元组的第 4个位置
// 插入三元组
appendElement(&M, 1, 2, 3);
appendElement(&M, 1, 4, 5);
appendElement(&M, 2, 3, 1);
appendElement(&M, 3, 1, 2);
// 展示三元组
display(M);
// outputs: 0 3 0 5
// 0 0 1 0
// 2 0 0 0
return 0;
}