第一次看三元顺序表和行逻辑连接顺序表,区别没想太明白,写了段代码梳理一下思路,顺带熟悉一下C/C++
#include<stdio.h>
#include <stdlib.h>
#define ArrSize 5
// 三元顺序表的元素结构
typedef struct {
int i; // 在原表的第几行
int j; // 在原表的第几列
int data; // 存储的值
} Triple;
// 三元顺序表结构
typedef struct{
int n =ArrSize; // 原表有几行
int m =ArrSize; // 原表有几列
int count; // 总共有非零元素的个数
Triple *dataArr; //三元顺序表
// 新增一个行逻辑顺序表 , 用来存储每行第一个非零值的位置
int *rpos;
}TripleArr;
// 输出所有的元素
void display(TripleArr *arr);
int main(){
// 产生一个稀疏矩阵
int arr[][ArrSize] = { {0,0,20,0,3},{0,1,0,0,0},{0,0,0,0,3}, {0,0,0,0,5},{6,0,0,0,0}};
// 压缩
int avaibleCount =0;
for(int i=0; i<ArrSize ; i++){
for(int j=0 ;j<ArrSize ;j++){
if(arr[i][j]>0){
avaibleCount++;
}
}
}
Triple *data = (Triple *)calloc(avaibleCount,sizeof(Triple));
int *rposition = (int*) calloc(ArrSize,sizeof(int));
int index =0;
for(int i=0; i<ArrSize ; i++){
bool first = true;
for(int j=0 ;j<ArrSize ;j++){
if(arr[i][j]>0){
data[index].i = i;
data[index].j =j;
data[index].data =arr[i][j];
if(first){
// 存储在三元顺序表中的位置
rposition[i] = index ;
first = false;
}
index++;
}
}
}
TripleArr *tripleArr = new TripleArr();
tripleArr->count = avaibleCount;
tripleArr->dataArr =data;
tripleArr->rpos = rposition;
// 使用
display(tripleArr) ;
// 释放
free(data);
free(rposition);
return 0;
}
// 输出所有的元素
void display(TripleArr *arr){
int row = arr->n;
int colum = arr->m;
for(int i=0 ;i<row ; i++){
for(int j=0 ; j<colum ; j++){
bool zeroValue = true;
// 如果只使用三元表,那么需要遍历 整个三元顺序表
/*for(int k = 0 ; k< arr->count; k++){
if(i == arr->dataArr[k].i && j == arr->dataArr[k].j){
printf(" %02d ",arr->dataArr[k].data);
zeroValue = false;
}
}*/
// 使用行逻辑连接的顺序表后,不用遍历所有的,只需要遍历该行的非零,
// 根据稀疏矩阵的特性,矩阵较大时, row << arr->count 理论上是降低了遍历的循环次数
for(int k = arr->rpos[i]; k<arr->rpos[i+1];k++){
if(i == arr->dataArr[k].i && j == arr->dataArr[k].j){
printf(" %02d ",arr->dataArr[k].data);
zeroValue = false;
}
}
if(zeroValue){
printf(" %02d ",0);
}
}
printf("\n");
}
}