稀疏矩阵的压缩存储

稀疏矩阵:设在mn的矩阵中有t个非零元素。
令ζ=t/(m
n)
当ζ<=0.05时称为稀疏矩阵。表示方法:三元组,十字链表

  1. 三元组
    在这里插入图片描述
    如图是一个三元组顺序表,三元组顺序表又称有序的双下标法
    三元组的优点:非零元在表中按行列有序存储,因此便于进依行顺序处理的矩阵运算。
    缺点:不能随机存取。若要按行号存取某一行中的非零元,需要从头开始进行查找。
    2.十字链表
    优点:能够灵活的插入和删除因运算产生的新的非零元素,实现矩阵的各种运算。
    在十字链表中,矩阵的每一个非零元素用一个节点表示,该节点除了(row,col,value)以外,还要有两个域:
    right:用于链接同一行中的下一个非零元素。(右方的第一个元素)。
    down:用于链接同一列中的下一个非零元素。(下方的第一个元素)。
    在这里插入图片描述
    在这里插入图片描述三元组存储:
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define MAXSIZE 100
typedef int Status;
typedef int ElemType;
//定义三元组线性表中的数据元素存储结构
typedef struct
{
	int row;        //行号
	int col;        //列号
	ElemType d;     //元素值,ElemType为数据元素类型

} TupNode; //三元组定义


//定义三元组线性表存储结构
typedef struct
{
	int rows;                   //行数值
	int cols;                   //列数值
	int nums;                   //非零元素个数
	TupNode* data;//data数据域
	int capacity;
} TSMatrix; //三元组顺序表定义
Status Great(TSMatrix& T, int n)
{
		printf("输入稀疏矩阵行数:");
	scanf("%d",&T.rows);
	printf("输入稀疏矩阵的列数:");
	scanf("%d",&T.cols);
	T.data = (TupNode*)malloc(n * sizeof(TupNode));
	if (!T.data)   exit(0);
	
	for (int i = 0; i < n; i++)
	{
		scanf("%d", &T.data[i].row);
		scanf("%d", &T.data[i].col);
		scanf("%d", &T.data[i].d);
	}
	T.nums = n;
	return OK;
}
int main()
{
	TSMatrix T;
	int n;
	printf("输入非零元个数:");
	scanf("%d", &n);

	Great(T, n);
	printf("存储的稀疏矩阵是:\n");
	for (int i = 1; i <= T.rows; i++)//以矩阵的形式打印出来
	{
		for (int j = 1; j <= T.cols; j++)
		{
			int v=0;
			for (int k = 0; k < T.nums; k++)
			{
				if (i == T.data[k].row && j == T.data[k].col)
				{
					printf("%d ", T.data[k].d);
				v=1;
			break;
				}
			}
			if(v==0)
			printf("0 ");
		}
		printf("\n");
	}
	return 0;
}


运行结果:
在这里插入图片描述


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值