稀疏矩阵
稀疏概念:当矩阵中只有很少的非零元素时,并且分布也不规律,非零元素只占20%~30%甚至更少,此矩阵称为稀疏矩阵
如果按照传统的存储方式例如数组存储会浪费大量空间(用于存储非零元素
或者相同常数
),但如果只存储少量的非零元素,而不存储大量的零或者相同常数,从而达到压缩存储的目的。但很多非零元素位置分布没有规律,所以需要添加一些辅助信息,例如行号,列号用于存储位置。稀疏矩阵的压缩存储结构分为两类:三元组顺序表,十字链表。
三元组顺序表
(1)三元组顺序表表示
typedef struct
{
int data;
int row,col;
}triple; //数组元素信息,行号,列号,数据信息
typedef struct
{
triple data[max]; //数组元素
int rows,cols,nums; //行数,列数,数组元素总数
}trix;
(2)转置运算
1.按列递增转置
#include<stdio.h>
#include<stdlib.h>
#define max 20
typedef struct
{
int data;
int row,col;
}triple; //数组元素信息,行号,列号,数据信息
typedef struct
{
triple data[max]; //数组元素
int rows,cols,nums; //行数,列数,数组元素总数
}trix;
void transform(trix *A,trix *B)
{
int i,j,k;
B->cols=A->rows; B->rows=A->cols;//转置后行变为列,列变为行
B->nums=A->nums;
if(B->nums>0)
{
k=1;
for(i=1;i<=A->cols;i++) //从A的第一列开时找B就会按先行序后列序的方式存储
for(j=1;j<=A->nums;j++) //从第一个元素开始找到满足的元素
if(A->data[j].col==i) //行列,数据交换
{
B->data[k].col=A->data[j].row;
B->data[k].row=A->data[j].col;
B->data[k].data=A->data[j].data;
k++;
}
} //该算法的时间主要浪费在双从循环中
}
int main(void)
{
int i,rows,cols,num;