稀疏矩阵:设在mn的矩阵中有t个非零元素。
令ζ=t/(mn)
当ζ<=0.05时称为稀疏矩阵。表示方法:三元组,十字链表
- 三元组
如图是一个三元组顺序表,三元组顺序表又称有序的双下标法
三元组的优点:非零元在表中按行列有序存储,因此便于进依行顺序处理的矩阵运算。
缺点:不能随机存取。若要按行号存取某一行中的非零元,需要从头开始进行查找。
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;
}
运行结果: