普通稀疏矩阵压缩方式:
采用三元组进行压缩
三元组:有三个数据项:行、列、值 构成一个新整体,既可以顺序存储也可以链式存储三元组数据
#include <stdio.h>
#include<stdbool.h>
#include<stdlib.h>
typedef struct Node
{
int row;
int lin;
int val;
}Node;
typedef struct Trip
{
Node *arr;//存储所有三元组元素
int cnt;//元素个数
int r_max;//列数
int c_max;//行数
}Trip;
Trip *create_trip(int r,int c ,int (*arr)[c],int cnt)
{
//申请内存空间并初始化
Trip *trip=malloc(sizeof(Trip));
trip->arr=malloc(sizeof(Node)*cnt);
trip->cnt=cnt;
trip->r_max=r;
trip->r_max=c;
//遍历待压缩的二维数组,存储非零元素到三元组中
int index=0;
for(int i=0;i<r;i++)
{
for(int j=0;j<c;j++)
{
if(arr[i][j])
{
trip->arr[index].row=i;
trip->arr[index].lin=j;
trip->arr[index++].val=arr[i][j];
}
}
}
trip->cnt=index;
return trip;
}
int main(int argc,const char* argv[])
{
int arr[7][8]={};
for(int i=0;i<7;i++)
{
for(int j=0;j<8;j++)
{
int x=rand()%7;
int y=rand()%8;
arr[x][y]=rand()%10;
}
}
for(int i=0;i<7;i++)
{
for(int j=0;j<8;j++)
{
printf("%d ",arr[i][j]);
}
printf("\n");
}
Trip *trip=create_trip(7,8,arr,10);
for(int i=0;i<trip->cnt;i++)
{
printf("%d %d %d \n",trip->arr[i].row,trip->arr[i].lin,trip->arr[i].val);
}
return 0;
}