数据结构严蔚敏----稀疏矩阵的三元组表示

编程语言:C
编译环境:Dev-C++
题目:输入稀疏矩阵,建立稀疏矩阵三元组顺序结构,实现转置

先来了解一下稀疏矩阵和三元组的关系:
稀疏矩阵的概念是:一个m行n列的矩阵,若它的非零元个数特别少,即可称它为稀疏矩阵
如何进行稀疏矩阵的压缩存储呢?
只存储稀疏矩阵的非零元。除了存储非零元的值a以外,还必须记下它的行下标i和列下标j
反之,一个三元组(a,i,j)唯一确定矩阵的一个非零元
因此,一个稀疏矩阵可由一个三元组数组和该矩阵的行列数来确定

稀疏矩阵的三元组顺序表存储表示:

#define MAXSIZE 12500//假设非零元个数的最大值为12500
typedef struct{
	int i,j;//行下标和列下标
	ElemType e; 
}Triple; 
typedef struct{
	Triple data[MAXSIZE+1];//非零元三元组表,data[0]未用 
	int mu,nu,tu;//行数、列数、非零元个数 
}TSMatrix;

矩阵的转置:
(1)将矩阵的行列值相互交换
(2)将每个三元组中的i和j相互调换
(3)重排三元组之间的次序
其中第三步是关键

源代码:

#include 
#include
#define OK 1
typedef int Status;
typedef int ElemType;
//稀疏矩阵的三元组顺序表存储表示
#define MAXSIZE 12500//假设非零元个数的最大值为12500
typedef struct{
	int i,j;//行下标和列下标
	ElemType e; 
}Triple; 
typedef struct{
	Triple data[MAXSIZE+1];//非零元三元组表,data[0]未用 
	int mu,nu,tu;//行数、列数、非零元个数 
}TSMatrix;
//创建矩阵
Status CreateTSMatrix(TSMatrix *M)
{
	printf("请输入行数、列数和非零元的个数:");
	scanf("%d%d%d",&(*M).mu,&(*M).nu,&(*M).tu);
	int k;
	printf("请依次输入%d个非零元的行下标、列下标和值:\n",(*M).tu);
	for(k=1;k<=(*M).tu;k++)
	    scanf("%d%d%d",&((*M).data[k].i),&((*M).data[k].j),&((*M).data[k].e));
	return OK;
}
//输出矩阵
Status PrintTSMatrix(TSMatrix M)
{
	if(M.mu==0||M.nu==0)
	{
		printf("矩阵为空!\n");
		return OK;
	}
	printf("行数为%d,列数为%d\n",M.mu,M.nu);
	if(M.tu==0)
	{
		printf("矩阵为零矩阵!\n");
		return OK;
	}
	int k;
	for(k=1;k<=M.tu;k++)
	    printf("%d\t%d\t%d\n",M.data[k].i,M.data[k].j,M.data[k].e);
	return OK;
}
//矩阵的转置
Status TransposeTSMatrix(TSMatrix M,TSMatrix *T)
{
	int row,k,k1=0;
	(*T).mu=M.nu;
	(*T).nu=M.mu;//行数变为列数,列数变为行数
	(*T).tu=M.tu;
	for(row=0;row

运行结果:
数据结构严蔚敏----稀疏矩阵的三元组表示_第1张图片
数据结构严蔚敏----稀疏矩阵的三元组表示_第2张图片
有任何建议欢迎底下评论,我会努力改进!

你可能感兴趣的:(数据结构,数据结构,严蔚敏,稀疏矩阵,三元组)