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

编程语言: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<stdio.h> 
#include<stdlib.h>
#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<M.nu;row++) 
	{
		for(k=1;k<=M.tu;k++)
		{
			if(M.data[k].j==row)
			{
				k1++;
				(*T).data[k1].i=M.data[k].j;
				(*T).data[k1].j=M.data[k].i;
				(*T).data[k1].e=M.data[k].e;	
			}
		}
	}
	return OK;
}
//主函数测试
int main()
{
	TSMatrix M,T;
	CreateTSMatrix(&M);
	printf("原矩阵为:\n");
	PrintTSMatrix(M);
	TransposeTSMatrix(M,&T);
	printf("转置后的矩阵为:\n");
	PrintTSMatrix(T);
	return 0;
}

运行结果:


有任何建议欢迎底下评论,我会努力改进!

  • 22
    点赞
  • 142
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值