编程语言: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;
}
运行结果:
有任何建议欢迎底下评论,我会努力改进!